oracle分页sql ,还有优化的余地吗?

发布于 2021-11-08 21:03:43 字数 559 浏览 795 评论 7

刚用p6spy + IronTrack监测了下应用,发现如下的oracle分页语句花费的时间比较长:

select *
  from (select t.*, rownum rn
          from (select t.*, 0 as cnt
                  from t_group t
                 where t_user_id = 6631717
                 order by ctime desc) t
         where rownum < 7)
 where rn >= 1

 

只在t_group的主键t_group_id字段上建索引,其他字段都没有建索引,

执行10,平均花费145毫秒,最多的时候用了687毫秒。

 

请问还有改进的余地吗? 一般像这种sql调优,该如何进行呢,谢谢 。

 

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

怎言笑 2021-11-12 17:01:11

这个看上去只是个按时间取前7条记录的SQL啊,有分页吗?最外层查询貌似没实际作用。

给t_user_id和ctime上加索引,然后看看执行计划

爱的那么颓废 2021-11-12 17:00:39

游标吧,像oracle这种顽固的家伙,是打死不出limit语法的。

墨洒年华 2021-11-12 16:59:24

t_user_id是number类型,刚在t_user_id上加了索引后,sql的执行时间少了一半。

孤独患者 2021-11-12 16:35:26

@zhangyou1010: ctime再加上索引试试。

躲猫猫 2021-11-12 13:13:36

@艺术家: ctime上有些值是空的,也可以建索引吗?

剑心龙吟 2021-11-11 03:05:26

@zhangyou1010: 空值的记录不会被索引啊

冬天旳寂寞 2021-11-10 21:42:06

t_user_id 是 什么类型的?

 比较不匹配的数据类型也是难于发现的性能问题之一。
下面的例子中,dept_id是一个varchar2型的字段,在这个字段上有索引,但是下面的语句会执行全表扫描。 
select * from dept where dept_id = 900198; 
这是因为oracle会自动把where子句转换成to_number(dept_id)=900198,就是3所说的情况,这样就限制了索引的使用。
把SQL语句改为如下形式就可以使用索引 

select * from dept where dept_id = '900198';

--------------------------------------------------------------------------------------------------------------------------------------------

ctime 要加索引啊

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文