我们有一个更新数百万条记录的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'));
答案 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
;