Sql server 是";按“偏移取货和订单”;订购整张表还是部分表?

Sql server 是";按“偏移取货和订单”;订购整张表还是部分表?,sql-server,sql-order-by,offset,database-administration,Sql Server,Sql Order By,Offset,Database Administration,在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 parti

在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;

我发现第二个查询大约需要30分钟才能完成,而第一个查询几乎需要0秒

所以我很好奇是什么导致了这种差异?如果这两个表的排序时间相同(或者它真的对整个表进行排序吗?
id
是表的聚集索引列。我无法想象在TB表上完成排序需要0秒。)

然后,如果排序需要相同的时间,唯一的区别就是聚集索引扫描。对于第一个查询,它只需要扫描前1行或前10行(少量)。而对于第二个查询,它需要扫描更多的行(>100000000)。但我不太确定这是否正确


谢谢你的帮助

让我举一个简单的例子

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 orderid

“部分表格”是什么意思?@TabAlleman我用“部分表格”来指表格的一部分。例如,如果我们只需要前100行,sql server可能只需要订购表的前1000行即可获得所需的内容。但我不太确定这是否正确。如果你再仔细思考一下你的问题,你会发现它毫无意义。SQL如何对“前1000行”进行排序而不首先对整个表进行排序以了解前1000行是什么?@TabAlleman,因为数据是以B-树的形式组织的,每个中间节点在下面存储最小和最大数据。Sql server很容易知道,对表的一部分进行排序可以满足我们的需要。这是对的吗?如果您对聚集索引进行排序,而这在您的问题中并没有最初说明,那么您就部分正确了。SQL将知道哪些页面将包含数据,因此不需要在查询时查看整个表,但这只是因为整个表已经由CI进行了逻辑排序。您不能跳过对整个表进行排序的步骤,但可以通过使用聚集索引来“提前”进行排序。那么,如果我们使用聚集索引列,“排序依据”一点也不费时吗?运行查询所需的时间仅取决于我们使用的偏移量?我将在问题描述中添加更多的示例。@Lubor:您的编辑已被aleady回答,关于偏移量,您是正确的
select top 1* from table
order by orderid