我正在使用Oracle来在应用服务器的两个节点之间同步事件(不要问为什么/是否这是最好的方法等,这是已知的)。为此,我使用一个"事件"表,其中一个节点("活动"节点)写入新事件,而另一个节点("被动"节点)从中读取。该表如下:事件UUID(UUID)||事件ID(long)||事件数据(多个不同类型的列)。事件ID是一个不断增加的数字(由应用程序控制,不是序列),表示在应用事件数据后内部模型的修订版本。事件UUID具有唯一约束。我在事件ID上建立了一个单一索引,以便于选择SQL-"Select...where Event_ID > XXX order by Event_ID",其中XXX是被动节点的内部修订号。偶尔我使用"truncate reuse storage"截断表格(实际上,我使用三个这样的表格按轮换顺序进行,因此我可以始终截断我要写入的那个表格,以便我的被动节点有时间"追赶")。
在插入和截断数小时后,一切正常,但是我开始从数据库中获得大量“噪音”,响应时间急剧下降。这可能会持续一两个小时(甚至更长时间),然后突然停止,响应时间恢复到正常水平。AWR报告指向截断语句,并且在一定程度上指向插入语句。我怀疑DBWR出了问题,但我无法确定。请注意,即使关闭了辅助节点(运行“SELECT”语句的节点),性能下降也会发生 - 因此它是纯插入/截断。注2:此问题在MSSQL上不会重现。
问题:为什么会发生这种情况?我该怎么做才能阻止它?是否有替代设计(越接近当前设计的替代方案越好)?
更新1:我可能误导了标题。这不是单个大规模插入,而是应用程序服务器生成事件时的插入滴水。
更新2:第一个期间(良好)和第二个期间(不良)的样本的AWR比较位于http://pastehtml.com/view/1eirn20.html。
在插入和截断数小时后,一切正常,但是我开始从数据库中获得大量“噪音”,响应时间急剧下降。这可能会持续一两个小时(甚至更长时间),然后突然停止,响应时间恢复到正常水平。AWR报告指向截断语句,并且在一定程度上指向插入语句。我怀疑DBWR出了问题,但我无法确定。请注意,即使关闭了辅助节点(运行“SELECT”语句的节点),性能下降也会发生 - 因此它是纯插入/截断。注2:此问题在MSSQL上不会重现。
问题:为什么会发生这种情况?我该怎么做才能阻止它?是否有替代设计(越接近当前设计的替代方案越好)?
更新1:我可能误导了标题。这不是单个大规模插入,而是应用程序服务器生成事件时的插入滴水。
更新2:第一个期间(良好)和第二个期间(不良)的样本的AWR比较位于http://pastehtml.com/view/1eirn20.html。
更新3:http://pastehtml.com/view/1eirn20.html处有新的AWR差异。
更新4:已解决。显然是存储问题(感谢ik_zelf!)。这表明 - 抽象并不真正抽象。最后,它只是一个磁化旋转盘。