当选择0行时,需要比WHERE EXISTS更好的方法

时间:2014-05-28 17:54:39

标签: sql performance where exists

我们有一个更新数百万条记录的SQL。当选择0行时,我们使用WHERE EXISTS来处理。 我的问题是还有另一种方法来处理这个问题以获得性能。或者这是最好的方式。我尝试合并,解释计划看起来不错,但它花费的时间比更新更多。

UPDATE /*+ parallel (a, 8) */
      SCH1.TAB1 a
   SET (age,
        dc_requested,
        ppt_qty,
        sol1_indic) =
          (SELECT age,
                  dc_requested,
                  ppt_qty,
                  sol1_indic
             FROM SCH2.TAB2 b
            WHERE     b.ip = a.ip
                  AND a.age IS NULL
                  AND (b.optype = 'P1' OR b.optype = 'P12'))
 WHERE EXISTS
          (SELECT 1
             FROM SCH2.TAB2 b2
            WHERE     b2.ip = a.ip
                  AND a.age IS NULL
                  AND (b2.optype = 'P1' OR b2.optype = 'P12'));

1 个答案:

答案 0 :(得分:0)

你不需要额外的EXISTS条款(只测试一行会更新)

UPDATE /*+ parallel (a, 8) */
      SCH1.TAB1 a
SET age = b.age
        , dc_requested = b.dc_requested
        , ppt_qty = b.ppt_qty
        , sol1_indic = b.sol1_indic
FROM SCH2.TAB2 b
WHERE b.ip = a.ip
AND a.age IS NULL
AND b.optype IN ('P1' , 'P12')
        ;

注意:这是Postgres的UPDATE语法(类似于Oracle的#)。其他平台需要UPDATE的语法略有不同。


更新:(试图保留原始语法方言)

UPDATE /*+ parallel (a, 8) */
      SCH1.TAB1 a
   SET (age, dc_requested, ppt_qty, sol1_indic) 
        = (SELECT age, dc_requested, ppt_qty, sol1_indic
             FROM SCH2.TAB2 b
            WHERE b.ip = a.ip
              AND (b.optype = 'P1' OR b.optype = 'P12')
          )
WHERE a.age IS NULL
        ;