前段时间做了一条SQL调优,这里记录一下,主要想梳理driving_site知识点,在这里也做个分享,立个Flag。
起因:
同事提出财务报表程式跑一个月资料时遇到Web页面超时报错,定位相应的view查询性能不好,并协助对其进行tuning。
调优效果:
原因 | 解决方案 | 效果 |
---|---|---|
关联查询Remote DB CTN1105G | 建议加上driving_site hint | 161min->1.5min |
Tuning过程:
分析program,定位为View v_rec_5454查询性能慢导致program执行timeout,然后对该View查询SQL查看执行计划,如下图:
从SQL执行计划可以看到,在Local DB的Local Table Access方面,并没有Large Table的full table scan,index都能用上。关注最后一行,有Remote Access CTN1105。这个Table在Remote DB,切是个大Table,因为Table不在Local,所以无法直接看到对这个Table的Access是走Index或者Full Table Scan。
真正执行上述查询,执行期间查看V$SESSION.EVENT(本视图记录了每个session的每一项等待事件),可以看到wait ing event是在SQL*Net message from dblink,符合慢在CTN1005@REMOTE_DBLINK的猜想。
结论:
综合评估,修改view,通过hint driving_site指定先以Remote DB的CTN1105作为driving table,并进行查询测试,大约90秒完成查询,且网络传输上性能也大大提升。
create or replace view v_rec_5454 as
select /*+ driving_site(f) */ b.entry_office Depot_Code,
知识点:
Oracle中Driving_site Hint的优化策略和思路:
策略:远程访问,网络传输占很大部分,优化原则,减少网络传输,将小的结果集拉到本地处理;
思路1:可以在远端数据库建立视图,在远端执行;
思路2:使用DRIVING_SITE将数据拉到本地执行处理;