![插入时 Oracle 重做日志性能下降](https://linux22.com/image/587226/%E6%8F%92%E5%85%A5%E6%97%B6%20Oracle%20%E9%87%8D%E5%81%9A%E6%97%A5%E5%BF%97%E6%80%A7%E8%83%BD%E4%B8%8B%E9%99%8D.png)
我有一个 Oracle 11g 数据库。我正在测试插入。数据库以非归档模式运行。我配置了 3 个重做日志,每个 2gb。
我正在尝试将数据插入测试表。开始时,速度为 15k 条/秒,一切顺利。插入 200 条后,我提交了一次。
但在插入约 130 万条记录后,速度变得非常慢,大约每秒 1-2k 条。正如我在资源管理器中注意到的,此时我们已经填满了所有重做日志,因此从这个点插入的速度很慢。
所以我的问题是,为什么当它填满重做日志时会变得如此缓慢,即使我每提交 200 条记录一次。以及如何修复这种情况(除了在插入时完全关闭日志记录)
答案1
重做日志以顺序方式写入。数据文件以随机方式写入。
每个硬盘驱动器在顺序写入时工作效果最佳,此时它可能达到全带宽(例如 100 MB/s),因为那时它不需要寻道(将其磁头重新定位到另一个轨道并等待轨道旋转到正确位置)。当它需要寻道时,单个 HDD 可能会被限制为每秒 200 次寻道。因此,如果您写入 8 kB 然后寻道到另一个位置,您将从同一驱动器获得 1.56 MB/s(即 200*8)。在这两种情况下,驱动器都将 100% 繁忙,但吞吐量有明显差异(200 vs 1.56)。对于 RAID0,多个驱动器在统计上提供每秒 n*200 次寻道。
这与 SSD 无关,在这种情况下寻道几乎是立即的。
在初始阶段,您的数据文件不会写入太多,因为所有插入都进入数据库缓存。重做日志总是立即写入,没有(太多)缓冲,它很快,是连续的。重做日志没有任何问题。一段时间后,您只是用完了可用缓存,数据库写入器会尝试通过写入数据文件来释放一些缓存。如果您只在一个表空间中的一个表中插入,则数据文件可能会按顺序或半顺序写入。
那么为什么要进行随机操作呢?很可能数据库中有一些额外的东西,比如:索引、分区、审计、其他表等。所有这些都有助于随机化。
将每个顺序操作分开在不同的物理硬盘驱动器上进行,并将所有随机操作放在另一组物理驱动器上,这将是有益的。否则顺序性能将受到严重影响。就您的情况而言,将重做文件与数据文件放在相同的物理硬盘驱动器上是不好的。
要获取更多信息,最好检查自动工作负载存储库 (AWR) 快照(这些是简单的文本报告)。