在SQL Server中,如果我尝试以下查询:
select id from table
order by id
offset 1000000 ROWS
fetch next 1000000 ROWS ONLY;SQL Server将如何工作?SQL server使用什么策略?
1. Do a sorting on the whole table first and then select the 1 million rows we need
2. Do a sorting on partial table and then return the 1 million rows we need.我认为这是第二个选择。如果是,SQL server如何决定表的哪个范围要排序?
编辑1:
我问这个问题是为了了解什么会导致查询速度变慢。我使用两个查询进行测试:
--Query 1:
select id from table
order by id
offset 1 ROWS
fetch next 1 ROWS ONLY;和
--Query 2:
select id from table
order by id
offset 1000000000 ROWS
fetch next 1 ROWS ONLY;我发现第二个查询大约需要30分钟才能完成,而第一个查询几乎需要0秒。
所以我很好奇是什么导致了这种差异?如果两者用于order by的时间相同(或者它真的对整个表进行排序吗?id是表的聚集索引列。我无法想象在一个to的表上完成排序需要0秒。)
如果排序花费的时间相同,那么唯一的区别就是聚集索引扫描。对于第一个查询,它只需要扫描前1或10 (少量)行。而对于第二个查询,它需要扫描更多的行( >1000000000 )。但我不太确定这是否正确。
谢谢你的帮助!
发布于 2016-09-07 02:39:45
让我举一个简单的例子..
order by id
offset 50 rows fetch 25 rows only对于上面的查询,步骤如下
1.表应该按id排序(如果没有付出排序的代价,就没有部分排序,总是完全排序)
2.然后扫描50+25行(花费75行),只返回25行。
下面是我的orders表的一个例子(orderid是Pk,所以排序),你可以看到,尽管我们只得到了20行,但你正在支付120行的成本……

对于您的问题,没有部分排序(这意味着只有关于排序的第一个选项),即使您尝试返回一行,如下所示。
select top 1* from table
order by orderidhttps://stackoverflow.com/questions/39355690
复制相似问题