0

我有一个来自公司的数据表,它是 250Gb,有 35 列。我需要删除大约 215Gb 的数据,这显然是要从表中删除的大量行。该表没有主键。

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

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

4

3 回答 3

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 :)。


希望它能澄清这个问题。

谢谢。

于 2012-08-09T09:09:01.327 回答
1

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

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

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

于 2012-08-09T08:52:04.983 回答
1

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

然后创建一个 sqlldr 控制文件以使用直接路径上传数据(这不会创建撤消/重做(但如果您需要恢复表,则在您进行下一次备份之前,您将拥有 CSV 文件)。

序列是

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

并行量取决于数据库服务器的 CPU 和内存——我们有 16 个 CPU 和一些 RAM 可以使用,所以这不是问题。

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

于 2012-08-09T14:51:44.220 回答