首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果没有指定order by,SELECT TOP是如何工作的?

如果没有指定order by,SELECT TOP是如何工作的?
EN

Stack Overflow用户
提问于 2013-03-06 18:52:08
回答 1查看 28.2K关注 0票数 20

msdn documentation说当我们写的时候

代码语言:javascript
复制
SELECT TOP(N) ..... ORDER BY [COLUMN]

我们得到按column (ascdesc,取决于我们选择的)排序的前(N)行

但如果我们不指定任何order by,msdn就会像Gail Erickson指出的那样使用random。正如他指出的那样,应该是unspecified而不是random。但正如Thomas Lee指出的那样

当TOP与ORDER BY子句一起使用时,结果集限制为排序的前N行;否则,它将返回前N行随机

所以,我在一个没有任何索引的表上运行了这个查询,首先我运行了这个..

代码语言:javascript
复制
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'

然后在其中一个表中(实际上我在上面的查询返回的所有表中尝试了下面的查询),我总是得到相同的行。

代码语言:javascript
复制
SELECT TOP (2) *
FROM
    MstConfigSettings

这总是返回相同的2行,对于查询1返回的所有其他表也是如此。现在执行计划显示了3个步骤。

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

Top显示实际行数为2,Table Scan也是如此;事实并非如此(有很多行)。

但是当我运行像这样的东西

代码语言:javascript
复制
SELECT TOP (2) *
FROM
    MstConfigSettings
ORDER BY
    DefaultItemId

执行计划显示

因此,当我不应用ORDER BY时,步骤是不同的(没有排序)。但问题是,在没有Sort的情况下,这个TOP是如何工作的,为什么以及如何使始终得到相同的结果?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-06 18:55:17

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

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

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

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15245322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档