Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server TOP是否在找到足够的行后停止处理?_Sql_Sql Server_Database_Performance - Fatal编程技术网

SQL Server TOP是否在找到足够的行后停止处理?

SQL Server TOP是否在找到足够的行后停止处理?,sql,sql-server,database,performance,Sql,Sql Server,Database,Performance,在查询中使用SQL ServerTOP子句时,SQL Server引擎是否会在满足需要返回的TOP X的条件后停止搜索行 考虑以下查询(假设某些_text_字段是唯一的,并且未设置全文索引): 及 第一个查询需要搜索整个表并返回找到的所有结果。但是,按照我们的设置方式,该查询将真正返回一个值。因此,使用TOP 1是否会阻止SQL server在找到匹配项后扫描表的其余部分?是的,一旦找到足够的行,查询将停止,并且不会查询表的其余部分 但是请注意,您可能希望有一个数据库可用于查询的索引。在这种情况

在查询中使用SQL Server
TOP
子句时,SQL Server引擎是否会在满足需要返回的
TOP X
的条件后停止搜索行

考虑以下查询(假设某些_text_字段是唯一的,并且未设置全文索引):


第一个查询需要搜索整个表并返回找到的所有结果。但是,按照我们的设置方式,该查询将真正返回一个值。因此,使用
TOP 1
是否会阻止SQL server在找到匹配项后扫描表的其余部分?

是的,一旦找到足够的行,查询将停止,并且不会查询表的其余部分

但是请注意,您可能希望有一个数据库可用于查询的索引。在这种情况下,获得第一个匹配和获得所有一个匹配之间实际上没有任何性能差异。

是的

在这种情况下,您将得到1个未定义的行(因为没有排序依据的
TOP
不能保证任何特定的结果),然后它将停止处理(计划中的
TOP
迭代器不会从子迭代器请求更多的行)


如果在
TOP
操作符之前的计划中有一个阻塞操作符(例如
SORT
),或者在
TOP
之前有一个并行操作符,那么它可能会对最终结果中未返回的行执行大量工作。

是,它在第一次匹配后停止。如果使用
TOP x
而不提供
ORDER BY
结果将是随机和不可预测的。因此:由于您应该为查询提供一个有意义的
ORDER BY
,因此您需要有一个适当的索引,以便查询处理器能够按顺序获取前n行,然后停止-否则需要扫描和排序整个表。@marc_s您的评论是最好的答案。:)TBH在提交我的答案之前,我没有阅读全部的广告,所以目前它没有针对你的具体情况。为什么
某些文本字段上没有定义唯一的索引?没有这个,你怎么能确定它是唯一的呢?我正在一个旧的系统上工作,像索引之类的东西还没有实现。我们仍在为类似的事情定义需要做什么。马丁·史密斯的答案是好的,但这一个与我的需求更相关。我正在开发旧的/遗留的软件,没有人做过索引,所以我们正在做这样的事情,最终执行整个表扫描只是为了找到一行数据。。。
SELECT
    pk_id
FROM
    some_table
WHERE
    some_text_field = 'some_value';
SELECT TOP 1
    pk_id
FROM
    some_table
WHERE
    some_text_field = 'some_value';