搜索主键时使用TOP(1)规范?

时间:2014-11-26 16:13:07

标签: sql-server tsql

使用主键查询表时,如下所示:

SELECT * FROM foo WHERE myPrimaryKey = @bar;

使用TOP (1)规范是否有意义/更快?

SELECT TOP (1) * FROM foo WHERE myPrimaryKey = @bar;

或者SQL Server是否足够聪明,在找到主键后停止搜索?

1 个答案:

答案 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毫秒)用于下载数据。

TOP Performances