【问题标题】:Does SQL Server TOP stop processing once it finds enough rows?一旦找到足够的行,SQL Server TOP 会停止处理吗?
【发布时间】:2012-03-30 02:49:59
【问题描述】:

当您在查询中使用 SQL Server TOP 子句时,一旦 SQL Server 引擎足以满足需要返回的 TOP X 行,它是否会停止搜索行?

考虑以下查询(假设 some_text_field 是唯一的并且未设置为全文索引):

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';

第一个查询需要搜索整个表并返回它找到的所有结果。但是,按照我们设置它的方式,该查询将永远返回一个值。那么,使用TOP 1 会阻止 SQL 服务器在找到匹配项后扫描表的其余部分吗?

【问题讨论】:

  • 是的,它会在第一次匹配后停止。
  • 如果您使用TOP x 而不提供ORDER BY,则结果将是随机的且不可预测。因此:由于您应该为查询提供一个ORDER BY 以使查询有意义,因此您需要有一个适当的索引,以便查询处理器能够按顺序获取前 n 行并在此之后停止 - 否则需要对整个表进行扫描和排序。
  • @marc_s 您的评论是最好的答案。 :)
  • TBH 在提交我的答案之前我没有阅读整个简介,所以目前它没有解决你的具体情况。为什么some_text_field 上没有定义唯一索引?如果没有这个,你怎么能确定它是独一无二的呢?
  • 我正在开发一个较旧的系统,索引之类的东西还没有实现。我们仍在定义此类事情需要做什么。

标签: sql sql-server database performance


【解决方案1】:

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

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

【讨论】:

  • Martin Smith 的回答很好,但这个回答更符合我的需求。我正在开发旧版/旧版软件,没有人经历过并且几乎没有制作任何索引,所以我们正在做这样的事情,最终执行整个表扫描只是为了找到一行数据......
【解决方案2】:

是的。

在这种情况下,您将获得 1 个未定义的行(因为 TOP 没有 ORDER BY 不保证任何特定结果)然后它将停止处理(计划中的 TOP 迭代器将不再请求任何行来自子迭代器)。

如果在TOP 运算符之前的计划中存在阻塞运算符(例如SORT)或TOP 之前的并行运算符,则最终可能会为最终结果中未返回的行做大量工作无论如何。

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    相关资源
    最近更新 更多