首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"offset-fetch and order by“是对整个表还是部分表进行排序?

"offset-fetch and order by“是对整个表还是部分表进行排序?
EN

Stack Overflow用户
提问于 2016-09-07 02:34:48
回答 1查看 862关注 0票数 2

在SQL Server中,如果我尝试以下查询:

代码语言:javascript
复制
select id from table 
order by id
offset 1000000 ROWS
fetch next 1000000 ROWS ONLY;

SQL Server将如何工作?SQL server使用什么策略?

代码语言:javascript
复制
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:

我问这个问题是为了了解什么会导致查询速度变慢。我使用两个查询进行测试:

代码语言:javascript
复制
--Query 1:
select id from table 
order by id
offset 1 ROWS
fetch next 1 ROWS ONLY;

代码语言:javascript
复制
--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 )。但我不太确定这是否正确。

谢谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2016-09-07 02:39:45

让我举一个简单的例子..

代码语言:javascript
复制
order by id
offset 50 rows fetch 25 rows only

对于上面的查询,步骤如下

1.表应该按id排序(如果没有付出排序的代价,就没有部分排序,总是完全排序)

2.然后扫描50+25行(花费75行),只返回25行。

下面是我的orders表的一个例子(orderid是Pk,所以排序),你可以看到,尽管我们只得到了20行,但你正在支付120行的成本……

对于您的问题,没有部分排序(这意味着只有关于排序的第一个选项),即使您尝试返回一行,如下所示。

代码语言:javascript
复制
select top 1* from table
order by orderid
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39355690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档