SQL优化案例

作者简介:戴秋龙,拥有超过八年的电信、保险、税务行业核心系统ORACLE数据库优化,优化经验,具备丰富的行业服务背景。对Oracle数据库有深刻的理解,擅长数据库故障诊断,数据库性能调优。

某金融系统,业务人员反应业务流程整运行非常慢,但是没有给出具体的SQL,需要根据数据库运行情况整体诊断。

首先整体分析业务高峰期的AWR报告, 在AWR报告中获取需要的信息。

从业务高峰期的AWR报告中看出每秒读取214个数据块,也就是说每秒读取2M不到的数据量, 而对于主流的存储来说压力很小了。 再看TOP5 的等待事件。

从TOP5 的等待事件看出主要是 dblink 的等待事件导致的, 而要降低此等待事件必须从优化SQL着手。

找到造成此等待事件的SQL:

另外通过和业务人员交流, 这两个SQl 在重要业务流程中, 基本上每天都会用。

Sql_id:3n4dp3cxtf4yr

sql_text:

执行计划:

很明显执行计划中笛卡尔集,导致SQL执行效率问题, 而导致此类问题的原因有两点。

1 业务人员写错SQL,

Where 条件中 or 没有加(), 跟业务人员交流,的确需要()。

2 由于关联远程表, 而远程表又缺少统计信息。CBO无法估算rows, 也可能导致笛卡尔集。

建议用hints, 强制两表hash 关联。

优化前:

优化后:

优化后效率提升明显。

SQL_ID:97t78urucbz9x

执行计划:

原因:

CBO无法估算远程的rows, 采用nested_loop 关联方式。

建议用hints, 强制两表hash 关联。

优化前:

优化后:

很明显SQL执行2小时, 减少到17S。

优化造成dblink 等待事件主要的两个SQL后, dblink 等待事件 大幅度减少, 在TOP5中没了。

未经允许不得转载:Oracle一体机用户组 » SQL优化案例

相关推荐