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()
。这就是为什么文件被修改为“未定义”而不是随机的原因。