在MSDN文档说,当我们写
SELECT TOP(N) ..... ORDER BY [COLUMN]
Run Code Online (Sandbox Code Playgroud)
我们得到排序的前(n)行column(asc或desc取决于我们选择的内容)
但是如果我们没有指定任何顺序,msdn random就像这里Gail Erickson指出的那样说.正如他所指出的它应该是而不是.但正如那点那样unspecifiedrandom
Thomas Lee
当TOP与ORDER BY子句一起使用时,结果集仅限于前N个有序行; 否则,它返回前N个行ramdom
所以,我在没有任何索引的表上运行此查询,首先我运行了这个..
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'
Run Code Online (Sandbox Code Playgroud)
然后在其中一个表中,(实际上我在上面查询返回的所有表中尝试了下面的查询)并且我总是得到相同的行.
SELECT TOP (2) *
FROM
MstConfigSettings
Run Code Online (Sandbox Code Playgroud)
这总是返回相同的2行,对于查询1返回的所有其他表也是如此.现在执行计划显示3个步骤..

正如您所看到的,没有索引查找,它只是一个纯表扫描,并且

的Top行示出了实际不为2,也是如此的Table Scan; 事实并非如此(我有很多行).
但是,当我运行类似的东西
SELECT TOP (2) *
FROM
MstConfigSettings
ORDER BY
DefaultItemId
Run Code Online (Sandbox Code Playgroud)
执行计划显示

和

所以,当我不申请时ORDER …