删除Oracle表的大量行

时间:2012-08-09 08:40:20

标签: oracle oracle10g

我有一个250Gb的数据表,有35列。我需要删除大约215Gb的数据 显然是要从表中删除大量行。此表包含主键。

从此表中删除数据的最快方法是什么? Oracle中是否有任何用于此类大型删除过程的工具?

请使用Oracle建议我采用最快的方法。

3 个答案:

答案 0 :(得分:3)

正如在上面的答案中所说,最好将要保留的行移动到单独的表中并截断表,因为有一个名为HIGH WATERMARK的东西。更多细节可以在http://sysdba.wordpress.com/2006/04/28/how-to-adjust-the-high-watermark-in-oracle-10g-alter-table-shrink/找到。删除操作将压倒您调用它的UNDO TABLESPACE

recovery model一词更适用于mssql我相信:)。


希望它能澄清此事。

感谢。

答案 1 :(得分:1)

你知道哪些记录需要保留?你如何识别每条记录?

解决方案可能是将要保留的记录移动到临时数据库,然后截断大表。然后,移回保留的记录。

请注意,事务日志文件可能因此而变得非常大(但取决于您的恢复模型)。

答案 2 :(得分:0)

很久以前我们遇到过类似的问题。有一个包含10亿行的表,但必须根据某些规则删除很大一部分数据。我们通过编写Pro * C作业来解析它,以提取我们想要保留的数据并应用规则,并将要保存的数据sprintf到csv文件。

然后创建了一个sqlldr控制文件,使用直接路径上传数据(不会创建撤消/重做(但是如果你需要恢复表,你有CSV文件,直到你进行下一次备份)。

序列是

  • 运行Pro * C以创建数据的CSV文件
  • 为索引生成DDL
  • 删除索引
  • 使用CSV文件运行sql *加载
  • 使用并行提示重新创建索引
  • 使用degree(8)
  • 分析表格

Parellelism的数量取决于数据库服务器的CPU和内存 - 我们有16个CPU和几个RAM可供使用,所以没有问题。

正确数据的摘录是其中最长的部分。 经过几次试运行后,SQL Loader能够在一小时内加载完整的10亿行(即数十亿或10亿行)。