Predicate Information (identified by operation id):
---------------------------------------------------
- access("SBI"."ID"=:B1)
- filter("SA"."ATTACH_NAME"=SUBSTR("SSI"."AZIMUTH_ANGLE_PHOTO",INSTR("SSI"."AZIMUTH_ANGLE_PHOTO",'
/',-1)+1,LENGTH("SSI"."AZIMUTH_ANGLE_PHOTO")))
- access("NFPI"."ID"="SSI"."NFPI_ID"(+))
- access("BPI"."ID"="NFPI"."BPI_ID"(+))
- access("DPI"."ID"="BPI"."DPI_ID"(+))
- access("DTI"."ID"="DPI"."TDL_ID"(+))
- access("CD"."ID"="DTI"."CD_ID"(+))
- filter("SA"."LONGITUDE" IS NOT NULL)
- access(TO_NUMBER("LONGITUDE")>119.191148 AND TO_NUMBER("LATITUDE")>26.074423 AND
TO_NUMBER("LONGITUDE")<119.197649 AND TO_NUMBER("LATITUDE")<26.077573)
filter(TO_NUMBER("LONGITUDE") IS NOT NULL AND TO_NUMBER("LATITUDE")<26.077573 AND
TO_NUMBER("LATITUDE")>26.074423)
这个执行计划,看起来无比正常,应该要left join的都有。
但问题的关键在于10 步骤-- MERGE JOIN CARTESIAN。笛卡尔乘积的排序合并连接,这个需要耗费很长时间。
等待这个结果要耗费几十秒,甚至要更久!
如何解决这样的问题,有以下几个方法:
重新收集每个表的统计数据--这个没有实验过,但即使那么做,可能也无效。不过从本例看,很有可能是这个导致的。
启用leading提示,结合其它提示
使用materialize提示
使用leading提示
select /*+ no_merge(a) no_push_pred(a) */
a.*
from (select
/*+ leading(cd dti dpi bpi ssi) */
...) a
where a.longitude is not null
/
执行计划
已选择 12 行。
执行计划
----------------------------------------------------------
Plan hash value: 1844304918