删除数百万条记录 oracle [关闭]
Posted
技术标签:
【中文标题】删除数百万条记录 oracle [关闭]【英文标题】:delete millions of records oracle [closed] 【发布时间】: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 代码会受到影响吗? 【参考方案1】:应该对具有数百万行的表进行分区。索引也应该被分区。分区会改变优化器选择的计划,但这是一件好事,因为优化器可以提出更好的执行计划。添加分区不会影响现有代码,删除分区会在提示中出现任何分区(无论如何您都没有)。
知道表中的总行数会更有帮助,这样我们就可以知道被删除的数据百分比。
此外,如果您可以设计分区,使您想要删除的所有行都落入一个或多个分区中,您可以删除这些分区(并创建新的),这是最快的删除方式像你这样的大桌子。
【讨论】:
“百万行的表应该分区”有点夸张。我们有 1 亿行未分区(也不需要分区)的表。 我同意@a_horse_with_no_name。此外,您只能以一种方式对每个表进行分区。这个DELETE
语句可能是当前的问题,但在确定是否以及如何对表进行分区之前,您可能需要查看整个应用程序。 EN_DATE
分区肯定会有所帮助,但总体上可能不是最好的。【参考方案2】:
“我们如何删除一个表中的 3000 万条记录。”
如果不需要一次性删除所有条目,则一次删除百分之几的条目,直到查询结果大小为零(如果这是在实时系统上执行的操作)。
也许找到要删除的条目的主键范围,手动更新删除SQL,这样一次删除百分之几,以免对LIVE造成太大影响。
【讨论】:
以上是关于删除数百万条记录 oracle [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
数据库如何删除数百万条记录?直接sql语句delete?服务器一直在跑,数据库也在变化 我要删除部分数据