微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

提高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.准备好备份,并确保将数据文件传输到备用数据库(如果有).

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐