【发布时间】:2020-04-30 16:17:12
【问题描述】:
我们一直在运行下面的脚本来更新运行 11G oracle DB (11.2.0.3) 的表中的一些列,这需要大约 61 小时才能完成,这令人惊讶,因为我们使用 Bulk collect 和 Forall 来执行实际操作更新。我们还启用了并行 dml。我们还尝试基于 rowid 进行更新,而不是使用索引的列,因为我们认为这样会更快。任何加快速度的建议都会很棒。下面是脚本
ALTER session enable parallel dml;
DECLARE
i NUMBER;
j number :=0 ;
TYPE tab_type IS TABLE OF rowid index by binary_integer;
tab_id tab_type;
CURSOR c1 IS
SELECT /*+ parallel(na,DEFAULT) */
rowid
from sample_table na
FOR UPDATE SKIP LOCKED;
BEGIN
OPEN c1;
LOOP
FETCH c1 BULK COLLECT INTO tab_id LIMIT 10000;
EXIT WHEN tab_id.COUNT = 0;
FORALL i IN 1..tab_id.COUNT
update sample_table
set col1 = 'XXX'
, col2 = 'XXX'
, col3 = 'XXX'
, col4 = 'XXX'
, col5= 'XXX'
, col6 = 'XXX'
WHERE rowid = tab_id(i);
j := j+1;
if mod(j, 1000) = 0 THEN -- Commit every 1000 records
COMMIT;
end if;
END LOOP;
CLOSE c1;
END;
/
【问题讨论】: