Oracle 并发更新大表
-- Start
如果你有一个很大的表要更新,千万别想着一次搞定,如果你这么干了,你会发现需要很长时间,最后的结果也不一定成功,为什么呢? 第一,Oracle 需要锁定整个表,这个过程中极有可能发生死锁。第二,Oracle 需要更多的日志文件用于回滚。第三,一旦发生点小问题会导致一个老鼠害一锅汤。那该怎么办呢?答案是分段执行,少量多次并发执行,下面是一个简单的例子。
DECLARE
l_sql_stmt VARCHAR2(1000);
BEGIN
-- 第一步: 创建任务
DBMS_PARALLEL_EXECUTE.CREATE_TASK ("task_test");
-- 第二步: 根据 ROWID 切块, 每次 100 行
DBMS_PARALLEL_EXECUTE.CREATE_CHUNKS_BY_ROWID("task_test", "TRADE", "EMPLOYEES", true, 100);
-- 第三步: 并发执行下面的 SQL
l_sql_stmt := "update /*+ ROWID (dda) */ EMPLOYEES e SET e.salary = e.salary + 10 WHERE rowid BETWEEN :start_id AND :end_id";
DBMS_PARALLEL_EXECUTE.RUN_TASK("task_test", l_sql_stmt, DBMS_SQL.NATIVE, parallel_level => 10);
-- 第四步: 删除任务
DBMS_PARALLEL_EXECUTE.DROP_TASK("task_test");
END;-- 更多参见:Oracle SQL 优化精萃
-- 声明:转载请注明出处
-- Last edited on 2015-07-01
-- Created by ShangBo on 2015-07-01
-- End
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。
- 上一篇: PL/SQL 集合 -- 多维数组
- 下一篇:没有了
