msdn 文档说,当我们写
SELECT TOP(N) ..... ORDER BY [COLUMN]
我们得到按column
(asc
或desc
取决于我们选择的内容)排序的前(n)行
但是,如果我们不指定任何 order by,msdn会random
按照此处Gail Erickson
指出的那样说。正如他指出的那样,应该是这样。但正如那里指出的那样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
,步骤是不同的(没有排序)。但问题是,如果没有,它是如何TOP
工作的Sort
,为什么以及如何总是给出相同的结果?