作者:豆伊一 | 来源:互联网 | 2023-07-03 15:57
篇首语:本文由编程笔记#小编为大家整理,主要介绍了加快Oracle DB上的更新记录了很多相关的知识,希望对你有一定的参考价值。
我必须更新有大约93万条记录的表,在开始DB每5秒更新10 k记录,现在大约60万条更新记录后,更新下一条10k记录需要30-60秒,不知道为什么我要更新null的列。
我使用循环提交每10 k记录:
LOOP
UPDATE TABLE
SET DATE_COLUMN = v_hist_date
WHERE DATE_COLUMN IS NULL
AND ROWNUM <= c_commit_limit
AND NOT_REMOVED IS NULL;
EXIT WHEN SQL%ROWCOUNT = 0;
COMMIT;
END LOOP;
你有什么想法为什么它减速这么多,怎么可能加快这个更新?
答案
更新也是查询。您尚未发布解释计划,但鉴于您正在过滤列为空的列,您的语句似乎可能正在执行全表扫描。这当然适合你描述的行为。
这是怎么回事。 FTS找到10000行的第一个循环几乎立即符合WHERE标准。然后退出循环并重新开始。这次FTS再次读取相同的块,包括它在上一次迭代中更新的块,然后找到它可以更新的下一个10000行。等等。每个循环都需要更长的时间,因为全表扫描必须为每个循环读取更多的表。
这是在循环内随机提交的惩罚之一。现在可能为时已晚,但更好的方法是跟踪索引列,例如主键。使用这样的跟踪密钥将允许索引扫描跳过您已访问过的行。