同事询问一个SQL执行了10分钟才出结果问还有没有优化空间;
SQL结构类似于:
select a.object_id,b.object_type,c.object_sid
from a1@dblink1 a,a2@dblink2 b,a3@dblink3 c,d4
where a.object_id=b.object_id
and b.object_ccid=c.object_ccid
and c.object_sod=d.object_sod
and existst ...;
我问:远程通过DBLINK的3个表数据量多大?
同事答:不知道
我回:好,我count一下
结果是远程表都是大表有些上亿行,而d4表有个特征在本过滤后的结果集很小,于是就想到了driving_site;
改造SQL,再次运行,结果降为3分钟
select /*+ driving_site(a) driving_site(b) driving_site(c) */ a.object_id,b.object_type,c.object_sid
from a1@dblink1 a,a2@dblink2 b,a3@dblink3 c,d4
where a.object_id=b.object_id
and b.object_ccid=c.object_ccid
and c.object_sod=d.object_sod
and existst ...;
同事又问:为什么用explain plan for看时预估的时间更长,而实际跑的时间却更短?
我答:这个是只是参考,实际结果并不一定如些;
小结:对于有些SQL,ORACLE并没有其实际的参考统计信息可用,比如远程的表的结果集,ORACLE并不能清晰知道,这种情况下
对于业务和返回集多少的了解更能帮助调整SQL的执行计划方向 ;
备注:本篇中的HINT是想告诉ORACLE,将3个含有DBLINK的3个表对象在远程端执行而不需要传到本地,反而是将本地的D4表传到远程的库上去执行;