Oracle性能优化-SQL优化(案例一)

环境:

OS:Red Hat Enterprise Linux AS release 4

DB:Oracle 10.2.0.1.0

问题现象:

客户反馈ERP系统操作缓慢,服务器IO负载较高;

问题原因:

(1)个别SQL执行效率较低,由于SQL执行计划不合理,造成SQL执行过程中的逻辑读和物理读较多,导致服务器IO负载较高,ERP运行缓慢;

(2)收集统计信息的JOB执行时间为工作时间9:13,和正常业务产生资源争用;

解决方案:

(1)优化SQL执行效率,减少SQL执行过程中产生的逻辑读和物理读,降低服务器IO负载;

方法:

收集数据不均匀列checkman和senderman的统计直方图;

(2) 建议将收集统计信息的JOB执行时间更改为非工作时间;

问题分析过程:

可以通过Oracle AWR报告或者iostat命令查看IO负载较高:

查找IO负载高的原因:

通过AWR报告可以看到消耗资源过多的SQL主要来源于以下两个:

一:协同凭证操作对应的SQL

二:用于自动收集统计信息的JOB

DECLARE job BINARY_INTEGER := :job; next_date DATE := :mydate; broken BOOLEAN := FALSE; BEGIN ANALYZE_TB; :mydate := next_date; IF broken THEN :b := 1; ELSE :b := 0; END IF; END

通过AWR查看SQL

通过PLSQL查看SQL

通过NMC查看SQL

SQL优化:

通过绑定变量值以及SQL执行计划分析SQL产生的执行计划不合理,pub_workflownote表没有走索引,而是走全表扫描;

查看数据分布情况,发现senderman和checkman列分布不均匀

对senderman和checkman列收集统计直方图

再次查看SQL执行计划,发现pub_workflownote表可以正常走索引

生成统计直方图后进行了第一次绑定变量窥探,将生成第一个带入参数值的正确执行计划;

欢迎关注我的微信公众号"IT小Chen",共同学习,共同成长!!!