sql – 当没有指定order时,SELECT TOP是如何工作的?

前端之家收集整理的这篇文章主要介绍了sql – 当没有指定order时,SELECT TOP是如何工作的?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
msdn documentation说当我们写的时候
SELECT TOP(N) ..... ORDER BY [COLUMN]

我们得到按列排列的顶(n)行(根据我们选择的是asc或desc)

但是,如果我们没有指定任何顺序,msdn说随机,因为埃里克森指出,here.他指出它应该是不明确的而不是随机的.但是如
托马斯·李指出那里

When TOP is used in conjunction with the ORDER BY clause,the result
set is limited to the first N number of ordered rows; otherwise,it
returns the first N number of rows 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返回的所有其他表也是如此.现在执行计划显示3个步骤..

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

顶部显示实际的行数为2,表扫描也是如此;不是这样(那里有很多行).

但是当我跑步的时候

SELECT TOP (2) *
FROM
    MstConfigSettings
ORDER BY
    DefaultItemId

执行计划显示

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

解决方法

不能保证你会得到哪两行.它将只是从表扫描中检索的前两个.

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

很可能扫描一堆,这将是分配顺序的前两行,但这不能保证.例如,sql Server可能使用advanced scanning功能,这意味着您的扫描将读取最近从另一个并发扫描读取的页面.

猜你在找的MsSQL相关文章