前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >rownum应用系列之分页查询--续1

rownum应用系列之分页查询--续1

作者头像
老虎刘
发布2022-06-22 17:43:49
3040
发布2022-06-22 17:43:49
举报
文章被收录于专栏:老虎刘谈oracle性能优化

昨天的思考题,老虎刘的建议是:

创建col_1和col_2字段上的联合索引,避免排序,提高效率。联合索引的字段顺序不能错,order by的字段要放在联合索引的最后。如果是order by desc,正常情况优化器会自动使用index descending扫描方式,不需要建索引的时候加desc 。也有sql复杂的时候优化器没有使用index descending扫描方式,则可以用index_desc来纠正。

今天刚好遇到一个分页查询的问题SQL,简化如下:

SELECT *

FROM (

SELECT

......

,ROWNUM RNSTART

FROM S_SRV_REQ SSR

WHERE SSR.ACT_OPEN_DT + 1 / 3 >= SYSDATE - 60 AND

ROWNUM <= 10 ORDER BY SSR.CREATED DESC

) T

WHERE T.RNSTART >= 1;

这个SQL有两个问题:

1、分页查询的写法有问题,rownum 与 order by并列同时出现在同一个where后面,这种写法得到的结果可能是乱序(除非使用CREATED字段上索引的降序扫描,但是如果该索引不可用,得到的结果就不对了),需要按照上一篇文章的写法进行改写。

2、谓词条件SSR.ACT_OPEN_DT + 1 / 3 >= SYSDATE - 60过滤性很好,而且存在ACT_OPEN_DT字段上的索引,但是因为字段上存在表达式 “+1 / 3“,导致索引不能使用,需要改写sql,将 SSR.ACT_OPEN_DT + 1 / 3 >= SYSDATE - 60 改成SSR.ACT_OPEN_DT >= SYSDATE - 60 - 1 / 3。

注:

因为谓词条件不是等值条件(昨天的sql是col_1= :b1,今天是col_x >=),这个sql如果创建ACT_OPEN_DT和CREATED联合索引是没有意义的,这种情况还是只会使用索引的第一个字段,无法避免排序。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 老虎刘谈oracle性能优化 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档