频繁或不频繁提交

Eve*_*Eve 1 oracle

我正在尝试运行更新查询,但仍然需要很长时间我在其中进行了提交。将提交设置为更高的值 (5000) 还是更低的 (1) 更好?我要更新2100万表中的1500万条记录

编辑这里是我的更新查询,但我需要知道我应该设置提交的低/高

DECLARE
CURSOR c_itemloc
IS
  SELECT item, loc 
  FROM dc_item_loc;

 l_item item_loc.item%TYPE;
 l_loc item_loc.loc%TYPE;
 i        NUMBER;
 l_commit VARCHAR2(1) := 'Y';

 BEGIN
   i:=0;
   FOR r_itemloc IN c_itemloc
   LOOP
     i := i+1;
     UPDATE item_loc il
     SET il.status             = 'D',
        il.last_update_datetime = get_vdate,
        IL.LAST_UPDATE_ID       = 'CNVOBJ_RNG'
     WHERE item                = r_itemloc.item
          AND loc                   = r_itemloc.loc;

     IF l_commit = 'Y' AND mod(i, 5000) = 0  THEN 
        COMMIT; 
     END IF;

    END LOOP;

  EXCEPTION
  WHEN OTHERS THEN
   dbms_output.put_line('YOU FAIL');
  END;
Run Code Online (Sandbox Code Playgroud)

Jus*_*ave 5

为什么首先要在 PL/SQL 中执行此操作?在 Oracle 数据库中执行任何操作的最有效方法应该是在 SQL 中执行

 UPDATE item_loc il
 SET il.status             = 'D',
    il.last_update_datetime = get_vdate,
    IL.LAST_UPDATE_ID       = 'CNVOBJ_RNG'
 WHERE EXISTS( SELECT 1
                 FROM dc_item_loc d
                WHERE d.item = il.item
                  AND d.loc  = il.loc );
Run Code Online (Sandbox Code Playgroud)

  • @Eve - 更新单个表中的 1500 万行不应该花费数小时。并且将简单的“UPDATE”SQL 语句转换为 PL/SQL 不应该让它运行得更快。还有什么事吗?是否有触发或未索引外键的触发器? (3认同)