分页语句如何优化效率

wozhengtao 2018-08-16 10:12:53
SELECT * FROM (SELECT r_t.*, ROWNUM r_rownum FROM ( select /*+rule*/ subscribersn from subscriberrentinfo where version >= :1 and version <= :2 ) r_t WHERE ROWNUM < :3 ) WHERE r_rownum >= :4
性能测试时发现此行语句执行时耗时最多,CPU使用率98%,请问如何进行优化
...全文
268 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
minsic78 2018-08-20
  • 打赏
  • 举报
回复
引用 5 楼 minsic78 的回复:
[quote=引用 4 楼 minsic78 的回复:]
条件的不可控性太大了,这个分页sql不可能在所有条件下都能被优化


如果满足这个version条件的数据很少很少,那么version上面的索引可解决问题,与分页无关,如果满足这个条件的数据非常非常多,几乎奔着全表去了,那么第一页的结果也应该很快,但是如果满足条件的数据不多不少,那就尴尬了。[/quote]

一不小心就三连:如果是第二种情况:满足条件的数据很多,那么你那/*rule*/提示就更尴尬了,去掉吧。

另外,把这事情扯的更复杂点:因为使用了绑定变量,version取值不同的时候,sql的执行计划可能会做出一些调整,这个与你的数据库版本,包括某些绑定变量相关的参数设置都会造成一些影响,这个要视情况而定了,比如bind peeking打开与否?ACS打开与否,cardinality feedback打开与否?
minsic78 2018-08-20
  • 打赏
  • 举报
回复
引用 4 楼 minsic78 的回复:
条件的不可控性太大了,这个分页sql不可能在所有条件下都能被优化


如果满足这个version条件的数据很少很少,那么version上面的索引可解决问题,与分页无关,如果满足这个条件的数据非常非常多,几乎奔着全表去了,那么第一页的结果也应该很快,但是如果满足条件的数据不多不少,那就尴尬了。
minsic78 2018-08-20
  • 打赏
  • 举报
回复
条件的不可控性太大了,这个分页sql不可能在所有条件下都能被优化
碧水幽幽泉 2018-08-17
  • 打赏
  • 举报
回复
Oracle是什么版本? 如果是10g,11g,12c,请把/*+rule*/ 提示去掉。
  • 打赏
  • 举报
回复
贴一下执行计划吧。。
卖水果的net 2018-08-16
  • 打赏
  • 举报
回复
贴出执行计划,光一个语句,看不出什么来。

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧