Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 当未指定订单依据时,“选择顶部”如何工作?_Sql_Sql Server_Tsql_Select_Sql Order By - Fatal编程技术网

Sql 当未指定订单依据时,“选择顶部”如何工作?

Sql 当未指定订单依据时,“选择顶部”如何工作?,sql,sql-server,tsql,select,sql-order-by,Sql,Sql Server,Tsql,Select,Sql Order By,书上说当我们写作的时候 SELECT TOP(N) ..... ORDER BY [COLUMN] 我们得到按列排序的顶部(n)行(asc或desc,具体取决于我们的选择) 但是,如果我们不指定任何订单,msdn会像盖尔·埃里克森指出的那样说“随机”。正如他指出的,它应该是未指定的,而不是随机的。但是作为 Thomas Lee在那里指出 当TOP与ORDERBY子句一起使用时,结果 集合限制为前N个有序行;否则, 返回ramdom的前N行数 所以,我在一个没有任何索引的表上运行了这个查询,首先

书上说当我们写作的时候

SELECT TOP(N) ..... ORDER BY [COLUMN]
我们得到按
排序的顶部(n)行(
asc
desc
,具体取决于我们的选择)

但是,如果我们不指定任何订单,msdn会像盖尔·埃里克森指出的那样说“随机”。正如他指出的,它应该是
未指定的
,而不是
随机的
。但是作为

Thomas Lee在那里指出

当TOP与ORDERBY子句一起使用时,结果 集合限制为前N个有序行;否则, 返回ramdom的前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个步骤

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

顶部
显示实际行数为2,
表格扫描也是如此
;事实并非如此(我有许多行)

但是当我运行类似

SELECT TOP (2) *
FROM
    MstConfigSettings
ORDER BY
    DefaultItemId
执行计划显示


因此,当我不应用排序依据时,步骤是不同的(没有排序)。但问题是,当没有排序时,
TOP
如何工作?为什么以及如何总是给出相同的结果?

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

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


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

我以为它只是按添加到数据库的日期排序的?最早的优先。它取决于dbms实现,因此定义了没有“order by”的“top”实现feature@AnatolyS-
TOP
无论如何都不是标准SQL,问题被标记为SQL Server.PS。现在的文档说的是“未定义”而不是“随机”。(虽然有一个例子仍然是随机的)那么如果没有保证,为什么我总是收到相同的2行?始终?因为表格扫描的操作方式始终相同。不保证并不意味着你不可能得到同样的结果。这只是意味着你不能依赖任何特定的观察顺序,如果它发生变化,你也不能抱怨。我所知道的唯一一种情况是,如果启动高级扫描,您将无法获得第一个分配页面中的前两行。@Razort4x-我认为您的困惑是因为在链接页面中使用了“随机”一词。这是不正确的。SQL Server不会故意将结果随机化,只是不会对您得到的两个结果做出任何特别的承诺。例如,如果您确实想要两个随机行,则需要
orderbynewid()
。这就是为什么文件被修改为“未定义”而不是随机的原因。