Oracle性能优化——NOT EXISTS改为LEFT JOIN性能提升649倍!

有一个SQL使用NOT EXISTS的方式,执行很慢很难出结果。

脚本如下:

select count(1) from (

SELECT /*+ full(t) */

     t.*

      FROM cpe_demands_t t

      LEFT JOIN cpe_items_i_t i

        ON t.demand_item = i.item_code

     WHERE t.demand_id IS NOT NULL

       AND t.batch_id = 51115  -- 入参

       AND t.max_bom_level = 3  -- 入参

       AND NOT EXISTS (SELECT /*+ parallel(kk, 10) */

             1

              FROM iscp_atp.cpe_pegging_t kk

             WHERE kk.batch_id = 51115

               AND kk.max_bom_level = 3

               AND kk.demand_id = t.demand_id)

       AND t.demand_date >= SYSDATE -7 * 7 -- 入参

       AND t.demand_date < SYSDATE + 1 * 7 -- 入参

       )

改为了LEFT JOIN的方式,性能提升明显。相同数据量下,NOT EXISTS的方式耗时422秒,

Oracle性能优化——NOT EXISTS改为LEFT JOIN性能提升649倍!

而LEFT JOIN的方式耗时仅0.65秒,性能提升649倍!

Oracle性能优化——NOT EXISTS改为LEFT JOIN性能提升649倍!

优化后的脚本如下:

select count(1) from (

select * from (

SELECT /*+ full(t) */

     t.*

      FROM cpe_demands_t t

      LEFT JOIN cpe_items_i_t i

        ON t.demand_item = i.item_code

     WHERE t.demand_id IS NOT NULL

       AND t.batch_id = 51115  -- 入参

       AND t.max_bom_level = 3  -- 入参

       AND t.demand_date >= SYSDATE -7 * 7 -- 入参

       AND t.demand_date < SYSDATE + 1 * 7 -- 入参

       ) tt left join

       cpe_pegging_t kk

       on kk.demand_id = tt.demand_id

             WHERE kk.demand_id  is null

       )

作者:waylau

猜你喜欢

转载自blog.51cto.com/14753584/2479937