我有一个来自公司的数据表,它是 250Gb,有 35 列。我需要删除大约 215Gb 的数据,这显然是要从表中删除的大量行。该表没有主键。
从该表中删除数据的最快方法是什么?Oracle 中是否有任何工具可用于如此大的删除过程?
请建议我使用 Oracle 最快的方法。
正如在上面的答案中所说,最好将要保留的行移动到单独的表中并截断表,因为有一个东西叫做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 :)。
希望它能澄清这个问题。
谢谢。
你知道哪些记录需要保留吗?您将如何识别每条记录?
一个解决方案可能是将要保留的记录移动到临时数据库,然后截断大表。之后,将保留的记录移回。
请注意,事务日志文件可能因此变得非常大(但取决于您的恢复模式)。
很久以前我们也遇到过类似的问题。有一个包含 10 亿行的表,但必须根据某些规则删除很大一部分数据。我们通过编写一个 Pro*C 作业来解决这个问题,以提取我们想要保留的数据并应用规则,然后将要保留的数据 sprintf 保存到 csv 文件中。
然后创建一个 sqlldr 控制文件以使用直接路径上传数据(这不会创建撤消/重做(但如果您需要恢复表,则在您进行下一次备份之前,您将拥有 CSV 文件)。
序列是
并行量取决于数据库服务器的 CPU 和内存——我们有 16 个 CPU 和一些 RAM 可以使用,所以这不是问题。
正确数据的提取是其中最长的部分。经过几次试运行后,SQL Loader 能够在一小时内加载完整的 10 亿行(即 10 亿或 10 亿行)。