我有一张包含1亿条记录的表格。
我想要删除60%的内容。现在我读到我应该复制表并插入有效值。(因为它更快)
例:
INSERT INTO Person_New SELECT * FROM Person_old where p.name is not null.
问题: 几分钟后,我的撤消空间已满,我不能!调整它的大小因为我没有权限。
问题: 我应该将插件拆分成多个部件,例如id范围吗?或者有更好的方法吗?
编辑第一条评论错误输出:
ORA-30036:无法在撤消表空间中将段扩展8 ...
答案 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
属性不起作用。