sql - oracle sql中删除大记录

标签 sql oracle sql-delete delete-row large-data

我有 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/

相关文章:

mysql - 获取表中不可用的数据

python - 带有 Python "Table has X columns but Y were supplied"的 SQLite

sql - postgresql:不允许负子字符串长度,但数据中没有明显的违规

java - 当 v$session.osuser 值超过 30 个字符时处理 JDBC 连接

sql - 删除加入语句

asp.net - 由于group by子句,撤消无效错误

javascript - 如果不刷新,我的代码将无法工作。它没有显示正确的页面颜色

java - 如何在 Java 中表示 Oracle Interval

sql-delete - 在 Sequelize 中使用 bulkDestroy

PHP 卡在 MySQL 的 delete 语句上