如何从Oracle 9i DB中删除大数据?
我有一个5 GB的表,现在我正在尝试删除,如下所示:如何从Oracle 9i DB中删除大数据?,oracle,oracle9i,Oracle,Oracle9i,我有一个5 GB的表,现在我正在尝试删除,如下所示: delete from tablename where to_char(screatetime,'yyyy-mm-dd') <'2009-06-01' 但我也没有发现任何阻塞 如何删除这些大数据而不出现任何问题? 使用必要的行查询 截断表 导入行 使用必要的行查询 截断表 导入行 如果screatetime上有索引,则您的查询可能未使用该索引。更改语句,以便where子句可以使用索引 delete from tablename
delete from tablename
where to_char(screatetime,'yyyy-mm-dd') <'2009-06-01'
但我也没有发现任何阻塞
如何删除这些大数据而不出现任何问题?- 使用必要的行查询
- 截断表
- 导入行
- 使用必要的行查询
- 截断表
- 导入行
delete from tablename where screatetime < to_date('2009-06-01','yyyy-mm-dd')
从表名中删除,其中screatetime<截止日期('2009-06-01','yyyy-mm-dd'))
如果screatetime上有索引,则您的查询可能未使用该索引。更改语句,以便where子句可以使用索引
delete from tablename where screatetime < to_date('2009-06-01','yyyy-mm-dd')
从表名中删除,其中screatetime<截止日期('2009-06-01','yyyy-mm-dd'))
首先锁定表时,它的运行速度要快得多。根据Rene的建议,还应更改where子句
LOCK TABLE tablename IN EXCLUSIVE MODE;
DELETE FROM tablename
where screatetime < to_date('2009-06-01','yyyy-mm-dd');
在独占模式下锁定表tablename;
从表名中删除
其中screatetime<截止日期('2009-06-01','yyyy-mm-dd');
编辑:如果由于表不断被访问而无法锁定,则可以选择salami策略删除这些行:
BEGIN
LOOP
DELETE FROM tablename
WHERE screatetime < to_date('2009-06-01','yyyy-mm-dd')
AND ROWNUM<=10000;
EXIT WHEN SQL%ROWCOUNT=0;
COMMIT;
END LOOP;
END;
开始
环
从表名中删除
其中screatetime<截止日期('2009-06-01','yyyy-mm-dd'))
ROWNUM当您首先锁定表时,它运行得更快。根据Rene的建议,还应更改where子句
LOCK TABLE tablename IN EXCLUSIVE MODE;
DELETE FROM tablename
where screatetime < to_date('2009-06-01','yyyy-mm-dd');
在独占模式下锁定表tablename;
从表名中删除
其中screatetime<截止日期('2009-06-01','yyyy-mm-dd');
编辑:如果由于表不断被访问而无法锁定,则可以选择salami策略删除这些行:
BEGIN
LOOP
DELETE FROM tablename
WHERE screatetime < to_date('2009-06-01','yyyy-mm-dd')
AND ROWNUM<=10000;
EXIT WHEN SQL%ROWCOUNT=0;
COMMIT;
END LOOP;
END;
开始
环
从表名中删除
其中screatetime<截止日期('2009-06-01','yyyy-mm-dd'))
ROWNUM5GB不是一个有用的表大小度量。行的总数很重要。要删除的行数占总事务数的比例。行的平均长度很重要
如果要删除的行的比例很小,那么在screatetime
上创建索引时可能值得一试,之后您将删除该索引。这可能意味着整个操作需要更长的时间,但至关重要的是,它将减少删除行所需的时间
另一方面,如果要删除大量行,您可能会发现
使用创建表的副本
'创建表t1_复制为从t1选择*
其中screatedate>=截止日期('2009-06-01','yyyy-mm-dd')`
使用rename
命令交换表
将约束、索引重新应用于新T1
要记住的另一件事是,删除比其他事务消耗更多的撤消,因为它们需要更多的信息来回滚。因此,如果您的记录很长和/或很多,那么DBA可能需要检查UNDO表空间(或者如果您仍在使用它们,则需要回滚seg)
最后,你有没有做过调查,看看时间到底在往哪里走?DELETE语句只是另一个查询,可以使用常规的调优技巧来处理它们 5GB不是表大小的有用度量。行的总数很重要。要删除的行数占总事务数的比例。行的平均长度很重要
如果要删除的行的比例很小,那么在screatetime
上创建索引时可能值得一试,之后您将删除该索引。这可能意味着整个操作需要更长的时间,但至关重要的是,它将减少删除行所需的时间
另一方面,如果要删除大量行,您可能会发现
使用创建表的副本
'创建表t1_复制为从t1选择*
其中screatedate>=截止日期('2009-06-01','yyyy-mm-dd')`
使用rename
命令交换表
将约束、索引重新应用于新T1
要记住的另一件事是,删除比其他事务消耗更多的撤消,因为它们需要更多的信息来回滚。因此,如果您的记录很长和/或很多,那么DBA可能需要检查UNDO表空间(或者如果您仍在使用它们,则需要回滚seg)
最后,你有没有做过调查,看看时间到底在往哪里走?DELETE语句只是另一个查询,可以使用常规的调优技巧来处理它们 多谢各位。我有个问题。需要导出吗?如果我将需要的数据插入到临时表中,然后截断并插入回原始表中,可以吗??如果我走这条路有什么问题吗?谢谢。我有个问题。需要导出吗?如果我将需要的数据插入到临时表中,然后截断并插入回原始表中,可以吗??如果我这样做有什么问题吗?如果你试图删除的记录只是总数的一小部分,那么索引可能是有用的。如果要删除表的很大一部分,则查询可能会执行完整的表扫描,而不使用索引。其他可能会减慢速度的因素:触发器。是否有任何触发器在删除时触发。外键。如果存在级联外键,您可能会从该表中删除更多内容。谢谢。您的反馈索引可能会减慢速度,因为它需要从索引和表中删除。最好将Oracle中的函数应用于不变数据(文字、常量或绑定变量),而不是将函数应用于变量数据,如列值。调用to_date()会为每个exec花费一些CPU,而最快的方法是避免这样做。如果您试图删除的记录只是总数的一小部分,则索引可能会很有用。如果要删除表的很大一部分,则查询可能会执行完整的表扫描,并且不会删除