博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle大表数据排序后分页查询效率很慢
阅读量:7096 次
发布时间:2019-06-28

本文共 1215 字,大约阅读时间需要 4 分钟。

hot3.png

    链接地址:

    好吧,昨天在整理Oracle分页,想起来做优化时候的一个知识点,需要记录下,我不是DBA,不过我也做过一些Oracle优化的工作,当然完全是通过 书本和百度。项目开发完成,为了测试数据库的性能,在几张表里添加了百万级的测试数据,一直听说Oracle处理千万级的数据性能也是杠杠的,信心满满的 上线内测了,好吧,列表页打不开了...

    不过才200万条数据,怎么会?于是开始debug,列表搜索页是通过分页展示的,项目中使用了Hibernate,并对Hibernate进行了封装,通过原生sql查询,返回分页后的数据,Hibernate生成的分页查询语句如下:

select * from (select t1.*,rownum rn from (select column1,column2 from test order by column1,column2 desc) where rownum <= 50) where rn > 0

    很快的发现了问题所在,由于列表页要求对数据进行排序展示,查询的时候对多个字段进行了排序,进行了全表扫描,导致效率缓慢,好吧,于是在多个排序字段上建立了复合索引,这样排序的时候通过索引一定会快很多。

create index test_index on test(column1,column2 desc);

    咦?为什么还是查询那么慢,依旧是全表扫描,索引没有起作用,再来,强制使用索引。

select * from (select t1.*,rownum rn from (select /*+index(test_index) */ column1,column2 from test order by column1,column2 desc) where rownum <= 50) where rn > 0

    查询依旧慢,难道是Hibernate的问题,好吧,我把Hibernate处理的部分改成了JDBC,问题依旧存在,悲催了,于是开始翻书,百度,找到了另外的一种分页查询的方式:

select * from test t1,( select rid from ( select rownum rn,t.rid from ( select /*+index(test_index) */ rowid rid from test order by column1,column2 desc ) t where rownum <= 50 ) where rn > 0) t2 where t1.rowid = t2.rid

    好吧,问题解决了,第一次做优化,对一些Oracle的机制并不熟悉,对一些问题也没有认识,目前还不清楚问题解决的原理和深层次的知识,还需要不断的学习啊。

转载于:https://my.oschina.net/realfighter/blog/349718

你可能感兴趣的文章
LINUX REDHAT第六单元文档
查看>>
python实现手机号归属地相关信息查询
查看>>
FastJson的简单使用
查看>>
带你走进神经网络的“前世今生”
查看>>
【学神-RHEL7】RHEL7.1安装步骤详解
查看>>
CIFS NFS
查看>>
网络IO模型的深入浅出
查看>>
Nagios 3 & Centreon 2 RC5 安装与配置(2)
查看>>
随机字符串生成算法
查看>>
Jenkins重置安全配置
查看>>
mahout0.7 示例运行纪实
查看>>
centos7快速部署ceph
查看>>
git安装和使用案例
查看>>
cisco路由器进入rommon模式
查看>>
awk Tips
查看>>
继承抽象类
查看>>
(摘)Excel 2007查询操作中的函数应用
查看>>
使用SCOM资源工具包来协助MP开发及调试
查看>>
从Linux终端管理进程:10个你必须知道的命令
查看>>
centos7 命令补全
查看>>