【发布时间】: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