我们有一个开始变大的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.