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功能,这意味着您的扫描将读取最近从另一个并发扫描读取的页面.