0

我有一个删除查询,例如:

delete from table1 where dataA between Date1 and Date2

我收到一个错误:

Caused by: java.sql.SQLException: ORA-01628: max # extents (10100) reached 
for rollback segment.

我想通过添加来修复删除语句

AND ROWNUM < 200 

这是解决问题的正确方法吗(表包含 blob 列 - 因此我认为回滚段很小)?

4

1 回答 1

1

我在 Oracle 中进行数据仓库批量处理,您的方法非常好。我想告诉 dba 说,嘿,添加大量的回滚/tmp 空间,所以我们永远不会遇到这种情况……但与许多客户一样……资源很多时候超出了我们的控制范围。

我在您只想分块删除的任何重复删除操作中所做的如下(Oracle Pl/sql 示例,但将移植到任何语言)请记住,此解决方案仅适用于没有条件 where 表达式的删除(您的示例)...如果您有where条件,我建议首先将rowid/keys批量提取到数组中,然后循环删除块...

//psuedo code
Create procedure (iCommit In Integer) 
   Loop
      Delete From Table where rownum < iCommit + 1;
      if SQL%ROWCOUNT < iCommit then
         exit loop;
      end if
      // incremental commit
      commit;
   End Loop;
   // final commit
   commit;
)
于 2013-01-14T21:53:05.353 回答