2

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

我有一个使用 2 个表的应用程序,一个是一个临时表,许多单独的进程写入该表,一旦一个“组”进程完成,另一个作业就会出现,将结果汇总到一个最终表中,然后删除那个'暂存表中的组'。

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

应用聚合时,对于暂存表中的每 20 行,最终表中的行减少到大约 1 行。

我正在考虑解决这个问题,而不是使用一个“临时”表,而是为每个“组”创建一个表。一旦完成,这个表就可以被删除,这应该会导致更少的重做。

我只有 SE,所以分区表不是一个选项。同样,用于重做的更快磁盘在短期内也可能不是一种选择。

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

谢谢。

4

4 回答 4

2

是否可以通过让您的进程执行逻辑删除(即将表中的DELETE_FLAG列设置为“Y”)然后有一个夜间进程截断表(可能将任何未删除的行写入单独的截断之前的表,然后在表被截断后将它们复制回来)?

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

于 2009-11-28T17:34:37.673 回答
1

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

于 2009-11-29T10:07:01.940 回答
0

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

于 2009-11-29T07:47:43.327 回答
0

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

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

于 2009-11-27T23:27:50.270 回答