当没有ORDER BY指定如何做选择顶级作品?(how does SELECT TOP works

2019-07-21 02:20发布

在MSDN文档说,当我们写

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

我们得到顶部由排序(N)行columnascdesc取决于我们选择什么样的)

但是,如果我们不指定任何顺序,MSDN说randomGail Erickson指出这里 。 正如他所指出的它应该是unspecified而不是random 。 但正如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'

然后在这些表中的一个,(其实我想下面的查询在所有上述查询返回的这些表的), 我总是得到相同的行。

SELECT TOP (2) *
FROM
    MstConfigSettings

这总是返回相同的2行,同样是通过查询1返回的所有其他表true现在执行计划显示了3个步骤..

正如你可以看到没有索引查找,这只是一个纯粹的表扫描,

Top示出的行的实际没有为2,也是如此所述Table Scan ; 这是不是这样的(我有很多行)。

但是,当我运行类似

SELECT TOP (2) *
FROM
    MstConfigSettings
ORDER BY
    DefaultItemId

执行规划显示

所以,当我不适用ORDER BY的步骤是不同的(没有排序)。 但问题是,这如何TOP当没有工作Sort ,为什么?它总是给出同样的结果?

Answer 1:

谁也不能保证你得到这两行。 这将只是从表扫描检索到的第2位。

TOP在执行计划中的迭代器将停止请求行一次两人已被退回。

可能对堆的扫描,这将是在分配顺序的前两行,但这不能保证。 例如SQL Server可能会使用先进的扫描功能,这意味着你的扫描将读取最近从另一个并行扫描读出网页。



文章来源: how does SELECT TOP works when no order by is specified?