通过设计克服'日志文件同步'?

时间:2009-11-27 18:48:11

标签: oracle oracle9i application-design

一些应用程序设计所需的建议/建议。

我有一个使用2个表的应用程序,一个是临时表,许多单独的进程写入,一旦“组”进程完成,另一个作业将结果聚合到一个最终表中,然后从登台表中删除该“组”。

我遇到的问题是,当临时表被清除时,会产生大量重做,并且我看到很多“日志文件同步”在数据库中等待。这是一个包含许多其他应用程序的共享数据库,这会导致一些问题。

应用聚合时,在登台表中每20行,最终表中的行减少到大约1行。

我正在考虑绕过这个,而不是只有一个'staging'表,我将为每个'group'创建一个表。完成后,可以删除此表,这样可以减少重做次数。

我只有SE,所以分区表不是一个选项。此外,重做的更快的磁盘也许在短期内也不是一种选择。

这是个坏主意吗?有没有更好的解决方案?

感谢。

4 个答案:

答案 0 :(得分:2)

是否有可能通过让您的进程执行逻辑删除(即将表中的DELETE_FLAG列设置为'Y')然后进行截断表的每晚进程(可能写入)来解决问题在截断之前将任何未删除的行转换为单独的表,然后在截断表后将其复制回来吗?

您确定日志文件同步等待的来源是您的磁盘无法跟上I / O吗?当然,这当然是可能的,但是还有其他可能导致日志文件同步等待过多的原因,包括过多的提交。在Pythian博客上有一篇关于tuning log file sync events的优秀文章。

答案 1 :(得分:1)

过多日志文件同步的最常见原因是过于频繁的提交,这些提交通常是在错误的尝试中故意编码以减少因锁定而导致的系统负载。您应该只在业务交易完成时提交。

答案 2 :(得分:0)

将每个组加载到一个单独的表中听起来像是一个减少重做的精细计划。您可以在每次聚合后截断单个组表。

另一个(但我认为可能更糟)选项是创建一个新的临时表,其中包含尚未聚合的组,然后删除原始表并重命名新表以替换临时表。

答案 3 :(得分:0)

我更喜欢Justin的建议(“逻辑删除”),但如果您拥有EE许可证,另一个需要考虑的选项可能是分区表。聚合过程可能会删除分区而不是删除行。