加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

sql-server – SQL Server中的分页

发布时间:2020-12-26 03:09:28 所属栏目:编程 来源:网络整理
导读:我有一个非常大的数据库,大约100 GB.我正在执行查询: select * from table_name; 我想只显示第100到第200行. 我想了解这是如何在内部发生的.数据库是否将所有记录从磁盘提取到内存中,并向查询客户端发送回第100行到第400行?或者是否存在任何机制,以便只使用

我有一个非常大的数据库,大约100 GB.我正在执行查询:

select * from <table_name>;

我想只显示第100到第200行.

我想了解这是如何在内部发生的.数据库是否将所有记录从磁盘提取到内存中,并向查询客户端发送回第100行到第400行?或者是否存在任何机制,以便只使用像B树等索引机制从数据库中获取那些记录(第100个第200个)?

我发现这与分页概念有关,但我无法确切地发现它在数据库级别内部是如何发生的.

解决方法

在您发布的查询中:
select * from <table_name>;

没有第100行到第200行,因为你没有指定ORDER BY.订单无法保证,除非您出于很多有趣的原因包含ORDER BY,但这不是真正的重点.

为了说明你的观点,让我们使用一个表 – 我将使用Stack Overflow data dump中的Users表,并运行此查询:

SELECT * FROM dbo.Users ORDER BY DisplayName;

默认情况下,DisplayName字段上没有索引,因此SQL Server必须扫描整个表,然后按DisplayName对其进行排序. Here’s the execution plan:

这不是很好 – 这是很多工作,估计的子树成本约为3万. (你可以通过将鼠标悬停在PasteThePlan上的select运算符上来看到它.)那么,如果我们只想要行100-200,会发生什么?我们可以在SQL Server 2012中使用此语法:

SELECT * FROM dbo.Users ORDER BY DisplayName OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY;

The execution plan on that也很难看:

SQL Server仍在扫描整个表以构建排序列表,只是为了给你100-200行,成本仍然在30k左右.更糟糕的是,每次运行查询时都会重建整个列表(因为毕竟有人可能已经更改了它们的DisplayName.)

为了使它更快,我们可以在DisplayName上创建一个非聚集索引,它是我们表的副本,按该特定字段排序:

CREATE INDEX IX_DisplayName ON dbo.Users(DisplayName);

使用该索引,our query’s execution plan现在执行索引:

查询立即完成,估计的子树成本仅为0.66(而不是30k).

总之,如果您以支持经常运行的查询的方式组织数据,那么是的,SQL Server可以使用快捷方式使您的查询更快.另一方面,如果你拥有的只是堆或聚集索引,那么你就搞砸了.

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读