sql – 当没有指定order时,SELECT TOP是如何工作的?
msdn documentation说当我们写的时候
SELECT TOP(N) ..... ORDER BY [COLUMN] 我们得到按列排列的顶(n)行(根据我们选择的是asc或desc) 但是,如果我们没有指定任何顺序,msdn说随机,因为埃里克森指出,here.他指出它应该是不明确的而不是随机的.但是如
所以,我在一个没有任何索引的表上运行这个查询,首先我运行了 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功能,这意味着您的扫描将读取最近从另一个并发扫描读取的页面. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |