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
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: Oracle 并行查询
- 下一篇: oracle数据库的并发初步理解