我有一个Oracle 11g数据库。 我正在testing插入。 数据库以noarchive模式运行。 我有3个重做日志configuration,每个2GB。
我试图插入数据到testing表中。 在开始时,它以15k /秒的速度运行良好。 我做了200次插入后的提交。
但大约1.3米插入logging后,它变得非常慢,大约1-2kins /秒。 正如我在资源pipe理器中注意到的那样,我们已经填充了所有的重做日志,所以从这个点插入工作缓慢。
所以我的问题是为什么它填充重做日志时变得如此缓慢,即使我提交每个200条logging。 而且这种情况如何解决(除了在插入时完全closures日志)
重做日志按顺序写入。 数据文件以随机方式写入。
每个硬盘驱动器在顺序写入时效果最好,此时它可以达到全带宽(比如100 MB / s),因为这样就不需要寻找(将磁头重新定位到另一个磁道并等待磁道旋转到适当的地方)。 当它需要寻求时,单个硬盘可能会被限制为每秒200次。 所以,如果你写8 kB,然后寻找另一个地方,你会从同一个驱动器1.56 MB /秒(这是200 * 8)。 在这两种情况下,驱动器将百分之百地忙碌,但是吞吐量有明显的差别(200对1.56)。 对于RAID0来说,统计提供了多个驱动器,例如n * 200每秒寻找。
这不涉及SSD,在这种情况下,寻求几乎是立竿见影的。
在初始阶段,您的数据文件不会写得太多,因为所有的插入都进入数据库caching。 重做日志总是立即写入,没有(多less)缓冲,它是快速的,它是顺序的。 重做日志没有错。 一段时间之后,您只需用尽可用caching,并且数据库写入器尝试通过写入数据文件来释放caching。 如果您只需在一个表空间中插入一个表,则数据文件可能会按顺序或半顺序写入。
那为什么随机操作? 那么可能你有额外的东西在数据库中,如:索引,分区,审计,其他表等,所有这些都有助于随机化。
将每一个顺序操作分开以发生在不同的物理硬盘驱动器上是有益的,并且将所有的随机操作放在另一组物理驱动器上。 否则顺序性能会受到严重的影响。 在你的情况下,重复执行文件与数据文件在同一个物理硬盘上是不行的。
有关更多信息,最好检查Automatic Workload Repository(AWR)快照(这些是简单的文本报告)。