通过插入批量删除 - 完全撤消空间

时间:2014-05-22 14:11:16

标签: sql oracle undo bulk

我有一张包含1亿条记录的表格。
我想要删除60%的内容。现在我读到我应该复制表并插入有效值。(因为它更快)

例: INSERT INTO Person_New SELECT * FROM Person_old where p.name is not null.

问题: 几分钟后,我的撤消空间已满,我不能!调整它的大小因为我没有权限。

问题: 我应该将插件拆分成多个部件,例如id范围吗?或者有更好的方法吗?

编辑第一条评论错误输出
ORA-30036:无法在撤消表空间中将段扩展8 ...

1 个答案:

答案 0 :(得分:4)

最好的选择是使用DDL语句避免UNDO生成:

CREATE TABLE PERSON_NEW NOLOGGING AS
   SELECT * FROM Person_old where p.name is not null

NOLOGGING是为了避免REDO生成并更快地执行创建。

但是,如果您必须执行INSERT,请考虑使用/*+APPEND*/提示进行直接路径插入:

INSERT /*+APPEND*/ INTO PERSON_NEW
  SELECT * FROM Person_old where p.name is not null

使用NOLOGGING属性创建表PERSON_NEW它将是有用的(也是危险的),但在DML操作中使用NOLOGGING属性不起作用。