使用主键查询表时,如下所示:
SELECT * FROM foo WHERE myPrimaryKey = @bar;
使用TOP (1)
规范是否有意义/更快?
SELECT TOP (1) * FROM foo WHERE myPrimaryKey = @bar;
或者SQL Server是否足够聪明,在找到主键后停止搜索?
答案 0 :(得分:3)
否,在您的特定情况下,使用TOP (1)
根本没用。
在处理整个查询之后应用TOP
子句,因此它仅用于限制服务器和客户端之间可能存在的高数据流的开销,或者无论何时想要限制您将从服务器检索的行数。
原因是因为我说TOP
在其他所有内容之后应用是因为它需要拥有有序数据,所以它必须在最后一个被评估的子句之后工作:ORDER BY
。
此外,TOP
可以让您使用x percent
检索第一行TOP(x) PERCENT
,因此,它需要知道行数及其顺序。
一个简单的例子是开发DBMS的最大敌人:SELECT * FROM Table
(我已经指定了开发,因为这是应该看到这种查询的唯一环境)。
有时我会使用SELECT * FROM
类型的查询,当我必须了解当我开发必须使用该表的内容时我期望的数据类型(不是数据类型)。
由于我想写一个非常简短的查询,而我需要的是一堆记录,我使用TOP子句:SELECT TOP 5 * FROM Table
SQL Server仍将查询处理为SELECT * FROM Table
,但它只会将前五行发回给我。
您可以自己尝试:编写一个应该检索多行的查询,检查其执行计划,添加TOP
子句并再次检查执行计划。在两种情况下它们都是相同的。
下面的图片显示了TOP
对您的查询的影响。没有TOP
的查询返回40700行。您可以清楚地看到服务器上的等待时间仅为2毫秒,但其余时间(267毫秒)用于下载数据。