数据分页效率问题--逻辑读取次数

Harrison_2009 2021-05-02 08:32:00
在数据查询分析时逻辑读取次数到底反应了什么?多嵌套查询逻辑读取次数反而更少?
如在一个100W数据的表中执行分页查询,现写了几个sql,分别是用 2012后新增Offset,Fetch Next分页方式,以及2005新增的row_number,代码如下:

Declare @pageIndex int = 800;
Declare @pageSize int = 20;
-- 分页查询1
Select * From [order] Order By id asc Offset (@pageIndex-1)*@pageSize Rows Fetch Next @pageSize Rows Only
-- 分页查询2
SELECT * FROM [order] WHERE ID IN (
SELECT ID FROM (SELECT ID,ROW_NUMBER() OVER ( ORDER BY ID asc) AS num FROM [order]) AS settable
WHERE num BETWEEN (@pageIndex-1)*@pageSize + 1 AND @pageIndex*@pageSize )
-- 分页查询3
SELECT * FROM (SELECT ROW_NUMBER() OVER (ORDER BY id) AS rid,* FROM [order]) AS t
WHERE t.rid between (@pageIndex-1) * @pageSize+1 AND @pageIndex*@pageSize



(20 行受影响)
表“Order”。扫描计数 1,逻辑读取次数 1455,物理读取次数 0,页面服务器读取次数 0,预读读取次数 0,页面服务器预读读取次数 0,LOb 逻辑读取次数 0,LOB 逻辑读取次数 0,LOB 页面服务器读取次数 0,LOB 预读读取次数 0,LOB 页面服务器预读读取次数 0。

(20 行受影响)
表“Order”。扫描计数 1,逻辑读取次数 89,物理读取次数 0,页面服务器读取次数 0,预读读取次数 0,页面服务器预读读取次数 0,LOb 逻辑读取次数 0,LOB 逻辑读取次数 0,LOB 页面服务器读取次数 0,LOB 预读读取次数 0,LOB 页面服务器预读读取次数 0。

(20 行受影响)
表“Order”。扫描计数 1,逻辑读取次数 1543,物理读取次数 0,页面服务器读取次数 0,预读读取次数 0,页面服务器预读读取次数 0,LOb 逻辑读取次数 0,LOB 逻辑读取次数 0,LOB 页面服务器读取次数 0,LOB 预读读取次数 0,LOB 页面服务器预读读取次数 0。

...全文
106 点赞 收藏 3
写回复
3 条回复
吉普赛的歌 05月05日
你先清所有缓存,再来测,每种方法单独测,不要搅到一起。 另外,你为什么只看逻辑读取次数,不看实际的时间(特别是CPU 时间)呢? CPU 时间才是金标准。 另外,还有执行计划,也是值得参考的。 回到你这个分页的实际问题来,你无非想知道offset 分页和row_number分页的效率差距。 这个我以前也测过,区别不大。 Offset 前几页有点优势,但后面就差不多了。 但分页真正想快,关键还要看具体的SQL,相关表及索引。具体情况具体分析。 优化有一定规律,但没有一劳永逸的优化方式,别指望学一招打遍天下。
回复 点赞
Harrison_2009 05月05日
从缓存中读取的页面数量多与少到店反映了什么问题呢?多层嵌套后反而减少了,如上述第二 跟第三种情况。脚本的优化又应该怎么处理呢?
回复 点赞
唐诗三百首 05月02日
逻辑读取次数是指从缓存中读取的页面数量.
回复 点赞
发动态
发帖子
疑难问题
创建于2007-09-28

9310

社区成员

12.1w+

社区内容

MS-SQL Server 疑难问题
社区公告
暂无公告