undo表空间不够

0
如果我的undo表空间10M,我有一张表,增量加载,每天先删除当日数据,然后再根据业务逻辑去加载数据,这张表日增量数据大于10M,那我delete from table1 where dw_date = 当日,发现delete的这些数据无法全部放入undo表空间
试问:1,除了更改undo表空间(扩展undo表空间)外是否有其他方法
    2,undo表空间如果是自动管理,那么是否是自动扩展的,不能超过最大值
已邀请:
0

老头子 - 专注是唯一的捷径 2016-05-19 回答

1. 批量提交
2. 设置为自动扩展就会自动扩展
 
关于批量提交,可以测试用下面的SQL:
DECLARE
  CURSOR CUR_B IS
    SELECT B.ACCT_ID, B.ACCT_SKID, A.ROWID ROW_ID
      FROM LAOTOUZI_A A, LAOTOUZI_B B
     WHERE A.ACCT_ID = B.ACCT_ID
     ORDER BY A.ROWID; ---如果表的数据量不是很大,可以不用 ORDER BY ROWID
  V_COUNTER NUMBER;
BEGIN
  V_COUNTER := 0;
  FOR ROW_B IN CUR_B LOOP
    ----update or delete----
    UPDATE LAOTOUZI_A
       SET ACCT_SKID = ROW_B.ACCT_SKID
     WHERE ROWID = ROW_B.ROW_ID;
    ------------------------
    V_COUNTER := V_COUNTER + 1;
    IF (V_COUNTER >= 1000) THEN
      --减少UNDO压力                          
      COMMIT;
      V_COUNTER := 0;
    END IF;
  END LOOP;
  COMMIT;
END;
 
0

我是最优雅的杀手,不杀人专杀狗 - 日光之下并无新事 2016-05-19 回答

1.可释放UNDO表空间,做UNDO表空间压缩。
2。考虑删除的开销很大且会占用大量的回滚段和产生大量日志,创建基于事务的全局临时表,将业务数据先加载到临时表,之后在将临时表以直接路径加载到目标表。提交之后,临时表数据会自动清空。
3.也可以采用MERGE INTO 去做。换种方式加载。(不适用大批量数据)
 

要回复问题请先登录注册