我想知道在一个表上使用“selecttop1”是否对性能有任何影响,该表有一个唯一标识符列,我在该列上执行所有搜索。这更像是为了开发人员的可读性而“我应该离开前1名”还是说前1名会影响性能速度?因为我的查询每次只返回一条记录,所以它有用吗?
o2g1uqev1#
主要的问题是你是否有一个索引(在这里接受答案)在你的唯一列或没有。如果您有一个索引(或者您添加了索引,或者我们讨论的是表的主键),那么对唯一值的搜索甚至会在读取表之前进行,并且前1不会产生任何影响,因为查询计划器将看到,无论如何只有一个值。因此,在本例中,前1不会影响性能。如果你没有一个索引,它实际上是无法确定什么样的解释计划将被生成。我们可以看到这样的情况:top 1实际上混淆了te query planner(在注解中或此处),并通过使用错误的连接类型导致性能下降,或者如果存在order by,则错误地具体化了整个表。所以在这种情况下,前1甚至会导致性能降级。另外,还有@damien\u the\u unsiverse和@larnu提到的可读性问题:如果代码不包含不必要的top 1,那么更容易理解编写者的意图。所以我要做的是:确保unique列被正确索引,并保留前1个。
1条答案
按热度按时间o2g1uqev1#
主要的问题是你是否有一个索引(在这里接受答案)在你的唯一列或没有。
如果您有一个索引(或者您添加了索引,或者我们讨论的是表的主键),那么对唯一值的搜索甚至会在读取表之前进行,并且前1不会产生任何影响,因为查询计划器将看到,无论如何只有一个值。因此,在本例中,前1不会影响性能。
如果你没有一个索引,它实际上是无法确定什么样的解释计划将被生成。我们可以看到这样的情况:top 1实际上混淆了te query planner(在注解中或此处),并通过使用错误的连接类型导致性能下降,或者如果存在order by,则错误地具体化了整个表。所以在这种情况下,前1甚至会导致性能降级。
另外,还有@damien\u the\u unsiverse和@larnu提到的可读性问题:如果代码不包含不必要的top 1,那么更容易理解编写者的意图。
所以我要做的是:确保unique列被正确索引,并保留前1个。