msdn documentation说当我们写的时候
SELECT TOP(N) ..... ORDER BY [COLUMN]
我们得到按column
(asc
或desc
,取决于我们选择的)排序的前(N)行
但如果我们不指定任何order by,msdn就会像Gail Erickson
指出的那样使用random
。正如他指出的那样,应该是unspecified
而不是random
。但正如Thomas Lee
指出的那样
当TOP与ORDER BY子句一起使用时,结果集限制为排序的前N行;否则,它将返回前N行随机
所以,我在一个没有任何索引的表上运行了这个查询,首先我运行了这个..
SELECT *
FROM
sys.objects so
WHERE
so.object_id NOT IN (SELECT si.object_id
FROM
sys.index_columns si)
AND so.type_desc = N'USER_TABLE'
然后在其中一个表中(实际上我在上面的查询返回的所有表中尝试了下面的查询),我总是得到相同的行。
SELECT TOP (2) *
FROM
MstConfigSettings
这总是返回相同的2行,对于查询1返回的所有其他表也是如此。现在执行计划显示了3个步骤。
正如您所看到的,没有索引查找,它只是一个纯粹的表扫描,并且
Top
显示实际行数为2,Table Scan
也是如此;事实并非如此(有很多行)。
但是当我运行像这样的东西
SELECT TOP (2) *
FROM
MstConfigSettings
ORDER BY
DefaultItemId
执行计划显示
和
因此,当我不应用ORDER BY
时,步骤是不同的(没有排序)。但问题是,在没有Sort
的情况下,这个TOP
是如何工作的,为什么以及如何使始终得到相同的结果?
发布于 2013-03-06 18:55:17
不能保证您会得到哪两行。它将只是从表扫描中检索到的前两个。
一旦返回两个行,执行计划中的TOP
迭代器将停止请求行。
对于堆的扫描,这可能是分配顺序中的前两行,但这是不能保证的。例如,SQL Server可能会使用advanced scanning功能,这意味着您的扫描将读取最近从另一个并发扫描中读取的页。
https://stackoverflow.com/questions/15245322
复制相似问题