12
返回列表 发新帖
楼主: 〇〇

[转载] 109-特定场景深度分页SQL优化技巧

[复制链接]
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
11#
发表于 2023-9-4 00:37 | 只看该作者
sql_tigerliu 发表于 2023-9-3 18:58
这种东西不可能是通用的 , 你的这个场景可以拆分成union all。 文章的场景用来优化本论坛可行否?

如果多个 owner 做查询条件,事先算好的序号就用不上了,union all 也不行。以我们公司为例,所有的分页界面都有灵活的组合查询条件和排序方式,有很多连接和聚合,所以文中提到的技巧,适用范围是非常有限的。

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
12#
发表于 2023-9-4 00:46 | 只看该作者
关于连续序号的讨论,在 asktom 上面有很多讨论,比如:
https://asktom.oracle.com/pls/ap ... ag=sequences-200206

顺便说一句,刘老师上面说的关于物化视图的一次性全量刷新的开销,其实并不是一次性,而是每天刷新都会发生。

使用道具 举报

回复
论坛徽章:
407
紫蛋头
日期:2012-05-21 10:19:41迷宫蛋
日期:2012-06-06 16:02:49奥运会纪念徽章:足球
日期:2012-06-29 15:30:06奥运会纪念徽章:排球
日期:2012-07-10 21:24:24鲜花蛋
日期:2012-07-16 15:24:59奥运会纪念徽章:拳击
日期:2012-08-07 10:54:50奥运会纪念徽章:羽毛球
日期:2012-08-21 15:55:33奥运会纪念徽章:蹦床
日期:2012-08-21 21:09:51奥运会纪念徽章:篮球
日期:2012-08-24 10:29:11奥运会纪念徽章:体操
日期:2012-09-07 16:40:00
13#
 楼主| 发表于 2023-9-4 07:46 来自手机 | 只看该作者
还有一种是把前几页读出来,缓存在应用里

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
14#
发表于 2023-9-4 08:37 | 只看该作者
如果只是“前几页”,那根本不是问题,传统的做法就很好,应用不缓存也无所谓。
这篇文章的重点是深度翻页,当N很大时,要得到第N页,用传统做法数据库不得不读取1~N页。所以他加了一个序号其实是事先把分页结果给存在表中。
而我上面的观点是,当N很大时,精 确定位到第N页没有实用意义,是个伪需求。
我上面帖子提到的末页导航,不过是反向排序而已,实际上还是取的前几页。

使用道具 举报

回复
论坛徽章:
2
20周年集字徽章-周
日期:2023-08-03 16:37:4519周年集字徽章-19
日期:2024-09-07 21:32:18
15#
发表于 2023-9-4 17:38 | 只看该作者
newkid 发表于 2023-9-4 00:46
关于连续序号的讨论,在 asktom 上面有很多讨论,比如:https://asktom.oracle.com/pls/apex/asktom.search ...

对于静态历史数据, 也是可以不用刷新的。 这个要看具体的业务场景。比如OA系统浏览2023年之前的历史记录, 创建一个mv也花不了几分钟, 然后就可以给所有人随便用了。 当然想实现随机组合的查询就不要想了,可以根据常用的查询组合创建一些mv, 特别是对历史静态数据的查询;

使用道具 举报

回复
论坛徽章:
2
20周年集字徽章-周
日期:2023-08-03 16:37:4519周年集字徽章-19
日期:2024-09-07 21:32:18
16#
发表于 2023-9-4 17:48 | 只看该作者
newkid 发表于 2023-9-4 08:37
如果只是“前几页”,那根本不是问题,传统的做法就很好,应用不缓存也无所谓。这篇文章的重点是深度翻页, ...

大部分深度分页需求都是因为产品经理不了解这里面的性能大坑,随便答应给客户做的。随着数据量的增加,客户就会发现想随意跳转会越来越困难。深度分页的绝大部分需求都是不太合理的, 我给的建议是通过增加查询条件(比如日期范围等)来避免生成大的结果集, 这个才是解决深度分页的**方法。如果客户确有需求, 那就要好好设计一下了, 我这个文章也是抛砖引玉, 提供了一个思路。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表