暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一条超过300行SQL代码优化

DBEngineer 2021-07-14
1490


还是报表上的SQL,不多说了,放代码。





优化前                


耗时:19min

返回:79215



SQL代码:



SQL执行计划:



--后面远程查询的sql就不放上来了,太长了。。


根据执行计划关键字VIEW:


可以得知SQL语句中from后面的关联查询,并没有执行视图合并。




关于视图合并一些知识


Oracle对包含视图的目标SQL做简单视图合并是有前提条件的,该SQL所包含视图的视图定义SQL语句中一定不能出现如下内容(包括但不限于):  

1)集合运算符(UNION,UNION ALL INTERSECT, MINUS)

2)CONNECT BY子句

3)ROWNUM

4)...



所以我们可以把每个from后面的(select)作为一个单元体,然后分别执行。


得知以下信息:



T3

返回1064行

td

返回5w

s

返回38w

t1(视图MM_POLICYLIST_TI_V)

需要执行很久。由此可以确定性能瓶颈在此视图上

T(表MM_POLICY_TI)

返回77W,加条件t.certitype = '2' 返回5w数据,可以在此表上的certitype建立索引。尽管certitype字段选择性几乎为0

create index IDX_MM_POLICY_TI_02 on MM_POLICY_TI (CERTITYPE);


MM_POLICYLIST_TI_V视图定义



MM_POLICYLIST_TI_V视图执行计划



注意观察id=6关键字为filter,且 id=10被驱动表走了 索引跳跃扫描



优化方法:


在谓词信息一栏中查找有绑定变量值的字段,并建立索引




优化完成后,再来运行整体SQL,4min15s能出结果。


对优化结果还不满意,继续优化。




观察id=7,表的连接方式为nested loops,


id=8驱动表为之前优化的视图(需要返回>60w以上数据),


id=13被驱动表为T表(加条件返回5w数据).


此时可以想到,这里应该让sql走hash连接的方式进行处理,所以我们可以添加以下hint


/*+use_hash(t,t1) leading(t) */



优化后                     


执行计划:


执行时间:1min 21s





优化到此

文章转载自DBEngineer,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论