我有 KPI_LOG
表,其中包含 600000
记录,并且该表每次都在增长。我在这个表中有TIME_STAMP
可以指定记录的创建时间,我必须从这个表中删除超过2天的记录。我正在使用以下查询来执行删除:
从 KPI_LOG 中删除,其中 SYSDATE - TIMESTAMP > 2;
但是由于记录数量太大,如果我仅使用删除查询来处理这种情况,将花费大量时间。我正在为此目的寻找更快的删除方法,但没有找到任何解决方案。
最佳答案
delete from KPI_LOG where SYSDATE - TIMESTAMP > 2;
如果您删除的行数比表中保留的行数多,那么您可以执行CTAS,即create table as select
,然后删除旧的并重命名新表。
确保您在 timestamp
列上有一个索引。
例如,
CREATE INDEX tmstmp_indx ON KPI_LOG(TIMESTAMP )
/
CREATE TABLE KPI_LOG_NEW
AS
SELECT * FROM KPI_LOG WHERE TIMESTAMP > SYSDATE -2
/
DROP TABLE KPI_LOG
/
ALTER TABLE KPI_LOG_NEW RENAME TO KPI_LOG
/
确保在新表上创建所有必要的索引和约束。
删除行不会重置HIGH WATERMARK,通过执行CTAS,您将拥有一个全新的表格。因此,您不必像删除时那样扫描高水位线以下的所有行。
关于sql - oracle sql中删除大记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31558869/