SQL优化

作者简介:孙显鹏,Oracle 十年从业经验,拥有11G ocp认证,精通内部原理,擅长调优,解决疑难问题,致力于帮助客户解决生产过程过出现的性能问题,提高生产效率!爱好书法!

现象概述

客户反映过程中的SQL语句查询不出结果,着急出结果,SQL如下:

收集相关信息

FM04_DEPT             大概500行
TB_CONS@DB_LK         大概600万,无有效可用条件
TB_RCA_CTRL_DET@DB_LK 大概300万,REMOTE_DATE 为DATE类型有index

处理过程

首先过滤条件字段存在索引但是却被函数转换需改写SQL使用索引过滤数据量:

改写为:

这样可过滤因散列读引起的不必要的数据量。

然后看执行:


查不出结果!!

从原始的执行计划可以看到 
1
:cost值很大,执行计划不理想
2:hash 中间结果数据量很大,这个结果做为驱动表和TB_RCA_CTRL_DET过滤链接非常耗时,不合理。
3:两个远程表应该首先过滤数据才是呀!这样才合理。

优化思路:让TB_RCA_CTRL_DET表作为驱动表和TB_CONS进行连接,IN 操作会让子查询作为驱动表(EXISTS 操作相反),改写如下:



改写后的执行计划
1:首先TB_RCA_CTRL_DET的内部视图VW_NSO_1和TB_CONS进行NESTED LOOPS,TB_RCA_CTRL_DET通过时间索引数据量很小作为驱动表,合理。
2:然后FM04_DEPT小表做驱动和远程表嵌套的结果集做hash,合理。
3: 22秒查出结果

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

相关推荐