从包含 1100 万行的表中删除 1000 行需要 24 小时

Delete 1000 rows from a table that contains 11 million rows takes 24h

提问人:Guru Prasad H 提问时间:10/13/2023 最后编辑:seenukarthiGuru Prasad H 更新时间:10/13/2023 访问量:46

问:

我使用 JDBC 模板执行以下删除请求。执行需要一整天的时间。

DELETE FROM main_events
WHERE  id IN (SELECT DISTINCT id
              FROM   temp_events
              WHERE  ( date + 14 ) < sysdate
                     AND rownum <= 1000)  

你有什么建议可以提高性能吗?

Oracle 性能 JDBCC模板

评论

1赞 Paul W 10/13/2023
1. 检查计划并确保它没有在日期列上使用索引。它应该是全表扫描。检查是否为该全表扫描启用了并行查询。检查是否启用了并行 dml(可能没有,因为您需要更改会话并提示删除)。最后,如果要删除表的重要部分,请考虑将要保留的记录拉出到临时表中,截断主表,然后重新插入追加。这比删除要快得多。此外,禁用非唯一索引,然后稍后重新生成它们create table as select
3赞 nvoigt 10/13/2023
你至少知道哪个部分很慢吗?在一个表中查找正确的 ID,还是从另一个表中删除 wm?
1赞 Paul W 10/13/2023
还有一件事,检查要删除的表上是否有任何引用 PK 或 UK 约束的外键约束。如果有,请禁用它们或确保对子表中的约束列编制索引。
2赞 Paul W 10/13/2023
另一件事是检查您是否在行锁或其他并发等待中被阻止,并且实际上根本没有完成任何事情。一整天删除 1100 万行似乎非常不合理。有些事情比糟糕的查询计划更严重。它可能是大型子表上未编制索引的外键列,也可能被阻止,在删除阻止条件之前无处可去。您的 DBA 应该能够为您提供帮助。
0赞 The Impaler 10/13/2023
没有 ORDER-ing 的 LIMIT-ing 意义不大。

答: 暂无答案