提高Oracle DELETE性能的策略
我们有一个开始变大的Oracle 11g安装.该数据库是在集群上运行的并行优化系统的后端.数据库中包含与进程的输入以及优化步骤的输出.输入包括rote配置数据和一些二进制文件(使用11g的SecureFiles).输出包括当前存储在数据库中的1D,2D,3D和4D数据.
数据库结构: /* Metadata tables */ Case(CaseId,DeleteFlag,...) On Delete Cascade CaseId OptimizationRun(OptId,CaseId,...) On Delete Cascade OptId OptimizationStep(StepId,OptId,...) On Delete Cascade StepId /* Data tables */ Files(FileId,Blob) /* deletes are near instantateous here */ /* Data per run */ OnedDataX(OptId,...) TwoDDataY1(OptId,...) /* packed representation of a 1D slice */ /* Data not only per run,but per step */ TwoDDataY2(StepId,...) /* packed representation of a 1D slice */ ThreeDDataZ(StepId,...) /* packed representation of a 2D slice */ FourDDataZ(StepId,...) /* packed representation of a 3D slice */ /* ... About 10 or so of these tables exist */ 收割者脚本每天都会出现,并查找DeleteFlag = 1的情况,并继续使用DELETE FROM Case WHERE DeleteFlag = 1,允许级联继续. 这个策略非常适合读/写,但是当我们想要清除数据时,现在已经超出了我们的功能!擦除是删除一个案例需要?20-40分钟取决于大小,通常会超载我们的存档空间.下一个主要版本的产品将采取“从根本上”的方法来解决问题.下一个次要版本需要保留在数据库中存储的数据范围内. 因此,对于次要版本,我们需要一种可以提高删除性能的方法,最多需要对数据库进行适度的更改. > REF分区,但问题是如何?我会喜欢在Case和REF上执行INTERVAL,其余的是but that isn’t supported.有没有办法通过触发器手动分割CaseId的OptimizationRun? 为了帮助说明这个问题,每个案例的数据范围从15MB到1.5GiB,任意20k到2M行. 更新:DB的当前大小为?1.5TB. 删除数据是一个工作的地狱,数据库.它必须在映像之前创建,更新索引,写入重做日志并删除数据.这是一个缓慢的过程.如果您可以有一个窗口来执行此任务,最简单和最快的是构建新的表,其中包含所需的数据.删除旧表并重命名新表.这需要一些设置工作,这是很明显的,但很有可能做到. 在删除之前删除索引的步骤不大.我的投票将用于CTAS(创建表作为选择)并构建新的表. 一个很好的分区模式肯定会很有帮助,也许在下一个版本中,Oracle可以组合间隔和引用分区.这将是非常好的. 禁用日志记录….不能对删除进行操作,但CTAS可以使用nologging.准备好备份,并确保将数据文件传输到备用数据库(如果有). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |