牛骨文教育服务平台(让学习变的简单)
博文笔记

Oracle 并发更新大表

创建时间:2015-07-01 投稿人: 浏览次数:3409

-- 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


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。