【问题标题】:delete millions of records oracle [closed]删除数百万条记录 oracle [关闭]
【发布时间】:2016-01-04 13:15:58
【问题描述】:

我们如何删除一个表中的 3000 万条记录。由于在线事务,我们无法删除并重新创建表。它是系统的关键表。

表上有 6 个大索引。没有任何分区。如果我们将分区添加到表中,很多 pl/sql 代码都会受到影响。

Delete from customers
where en_date < sysdate;

【问题讨论】:

  • 你的表分区了吗?
  • 提前计划并分区表。
  • 使用适当的 sysdate 替换运行多个查询。
  • 您的原始删除将与任何“分块”解决方案一样执行,但您需要确保 30M 行有足够的撤消空间。最好分批删除和提交(比如说)1000 行,但这只是为了避免用完 undo 空间,而不是为了提高性能,
  • "如果我们将分区添加到表中,很多 pl/sql 代码都会受到影响。"你能详细说明一下有多少 pl/sql 代码会受到影响吗?

标签: sql oracle oracle11g query-performance


【解决方案1】:

应该对具有数百万行的表进行分区。索引也应该被分区。分区会改变优化器选择的计划,但这是一件好事,因为优化器可以提出更好的执行计划。添加分区不会影响现有代码,删除分区会在提示中出现任何分区(无论如何您都没有)。

知道表中的总行数会更有帮助,这样我们就可以知道被删除的数据百分比。

此外,如果您可以设计分区,使您想要删除的所有行都落入一个或多个分区中,您可以删除这些分区(并创建新的),这是最快的删除方式像你这样的大桌子。

【讨论】:

  • “百万行的表应该分区”有点夸张。我们有 1 亿行未分区(也不需要分区)的表。
  • 我同意@a_horse_with_no_name。此外,您只能以一种方式对每个表进行分区。这个DELETE 语句可能是当前的问题,但在确定是否以及如何对表进行分区之前,您可能需要查看整个应用程序。 EN_DATE 分区肯定会有所帮助,但总体上可能不是最好的。
【解决方案2】:

“我们如何删除一个表中的 3000 万条记录。”

如果不需要一次性删除所有条目,则一次删除百分之几的条目,直到查询结果大小为零(如果这是在实时系统上执行的操作)。

也许找到要删除的条目的主键范围,手动更新删除SQL,这样一次删除百分之几,以免对LIVE造成太大影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多