博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ORACLE查询优化
阅读量:6852 次
发布时间:2019-06-26

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

  hot3.png

 ORACLE查询优化:
    症结:
目前项目数据库查询速度太慢,130W的数据分页查询页面请求直接超时,拿语句到PLSQL进行查询,超30秒,不能忍,直接点终止查询了。
    针对目前查询速度的优化思路及方案:
拿到查询的SQL到手后,先去掉关联表后,直接业务主表单表查询,发现只少了十几秒左右,看来一半问题在于主表。
不多说直接看查询计划,发现 SORT ORDER BY  TABLE ACCESS FULL ,ok,去掉order by 后查询1秒多,症结找到!
A. 首先想到的是oracle排序空间是否足够,Oracle排序是在PGA中进行的,当PGA的内存不足时,则需要使用到临时表空间,
   使用临时表空间,会急剧的加大IO,从而降低整个排序的性能。所以,如果条件允许,尽量加大PGA的大小,让整个排序过程在内存中完成。
 这个简单,发现sort_area_size值还是默认的64KB大小,同时查看一下是否占用了disk sorts ,并相应增加sort_area_size参数值
 直到显示为 0  sorts (disk)
B.然后思考解决办法,首先关联表太多,导致损耗十几秒时间,首先想到的是查改分离,
1. 先建立查询表,只保留查询结果需要的字段,新增加一个数值类型的主键字段,同时对应增加一个SEQ
2. 数据先排序后,再批量导入,主键将按照排序后的SEQ生成对应主键
3. 在业务主表增加相应的触发器(新增,修改,删除),业务表变动触发同步到查询表
结果:
业务单表order by 查询 15秒左右浮动
查询单表按照主键 order by 查询 0.002秒左右浮动 
跟踪查询计划变为  COUNT STOPKEY TABLE -- ACCESS BY INDEX ROWID -- INDEX FULL SCAN 
这才是想要的,可见table full 的消耗何其恐怖...
C.最后就是加上分页了
SELECT * FROM ( 
  SELECT ROWNUM AS ROWN,DB.* FROM ( 
  SELECT * FROM TABLE
   ORDER BY PK_COL
  ) DB  
) TEMPDB WHERE 1=1 AND TEMPDB.ROWN > 0 and tempdb.rown <= 10
一执行,需要4秒左右,WHY?,不加分页就执行里面那句可是毫秒级别的查询反馈,继续查看执行计划,发现又是万恶的 TABLE FULL
其实大家眼尖的已经发现了,分页不是这么写的,不描述的直接上代码:
SELECT * FROM ( 
  SELECT ROWNUM AS ROWN,DB.* FROM ( 
  SELECT * FROM TABLE
  WHERE ROWNUM <=10
  ORDER BY PK_COL
  ) DB  
) TEMPDB WHERE 1=1 AND TEMPDB.ROWN > 0 
很好继续跑到毫秒级,到这里就结束了。
最后COUNT(1)一遍再加上select * 一遍 加起来在PLSQL执行都只要20几毫秒,
集成到项目上测试,耗时5秒左右,这就不是我能控制的了,但至少操作等待时间还勉强能接收,页面不会挂掉了.

转载于:https://my.oschina.net/alfie/blog/637577

你可能感兴趣的文章
深入理解并行编程4
查看>>
Internet Connection speeds
查看>>
puppet运维自动化之puppet模块示例
查看>>
[Site Explore]图虫网 | tuchong.com
查看>>
如何让云×××:VIS Creator 带给您一个市场领先的私有云管理平台
查看>>
获取各个ISP运营商IP地址修正版[菜鸟级]
查看>>
Java数据结构和算法-003
查看>>
python核心编程--第五章
查看>>
python核心编程:杂记4
查看>>
linux防火墙iptables常用规则(屏蔽IP地址、禁用ping、协议设置、NAT与转发、负载平衡、自定义链)...
查看>>
我的友情链接
查看>>
关于Mac系统中SequelPro工具对于Mysql数值类型nt(M)存值的bug
查看>>
Linux下重置MySQL的Root帐号密码
查看>>
下一个目标-百度
查看>>
从构建分布式秒杀系统聊聊验证码
查看>>
百度地图API学习之路(2)
查看>>
dell服务器硬盘的状态变成外来(foreign)
查看>>
redhat6.4更换centos 6 的 yum源
查看>>
jsquery问题
查看>>
深入了解android平台的jni---编译ffmpeg源码
查看>>