一旦找到足够的行,SQL Server TOP是否会停止处理?

jzi*_*011 9 sql database sql-server performance

TOP在查询中使用SQL Server 子句时,SQL Server引擎是否足以满足TOP X返回所需的行时是否停止搜索行?

请考虑以下查询(假设some_text_field是唯一的,而不是为全文索引设置):

SELECT
    pk_id
FROM
    some_table
WHERE
    some_text_field = 'some_value';
Run Code Online (Sandbox Code Playgroud)

SELECT TOP 1
    pk_id
FROM
    some_table
WHERE
    some_text_field = 'some_value';
Run Code Online (Sandbox Code Playgroud)

第一个查询需要搜索整个表并返回它找到的所有结果.我们设置它的方式,该查询将真正返回一个值.那么,TOP 1一旦发现匹配,会阻止SQL服务器扫描表的其余部分吗?

Guf*_*ffa 6

是的,查询在找到足够的行后停止,并且不查询表的其余部分.

但请注意,您可能希望拥有数据库可用于查询的索引.在这种情况下,获得第一场比赛和获得所有一场比赛之间并没有任何性能差异.


Mar*_*ith 5

是.

在这种情况下,你会得到1个未定义行(如TOP没有ORDER BY不保证任何特定结果),那么将停止处理(TOP在计划将不再向孩子迭代任何更多的行迭代器).

如果SORTTOP运算符或并行运算符之前的计划中存在阻塞运算符(例如),TOP它可能最终会为最终结果中未返回的行执行大量工作.