20

msdn 文档说,当我们写

SELECT TOP(N) ..... ORDER BY [COLUMN]

我们得到按columnascdesc取决于我们选择的内容)排序的前(n)行

但是,如果我们不指定任何 order by,msdn会random按照此处Gail Erickson指出的那样说。正如他指出的那样,应该是这样。但正如那里指出的那样unspecifiedrandom 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,为什么以及如何总是给出相同的结果?

4

1 回答 1

22

无法保证您得到哪两行。它只是从表扫描中检索到的前两个。

一旦返回两个行,执行计划中的TOP迭代器将停止请求行。

对于堆的扫描,这可能是分配顺序的前两行,但这不能保证。例如,SQL Server 可能使用高级扫描功能,这意味着您的扫描将读取最近从另一个并发扫描中读取的页面。

于 2013-03-06T10:55:17.080 回答