leading提示和ordered提示以及materialize提示(2)

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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/030b9a01c5537e35a38f8c462779ef19.html