我有一个 oracle 11g 数据库。我正在测试插入。数据库运行在noarchive模式。我配置了 3 个重做日志,每个 2gb。
我正在尝试将数据插入测试表。一开始它以 15k ins/秒的速度运行良好。我在 200 次插入后提交。
但是在大约 1.3m 插入记录后,它变得非常慢,大约 1-2k ins/second。正如我此时在资源浏览器中注意到的那样,我们已经填满了所有重做日志,因此从这一点开始的插入工作很慢。
所以我的问题是为什么它在填充重做日志时变得如此缓慢,即使我每提交 200 条记录也是如此。以及如何解决这种情况(除了在插入时完全关闭日志记录)
重做日志是按顺序写入的。数据文件以随机方式写入。
每个硬盘驱动器在顺序写入时工作最好,此时它可能达到全带宽(比如 100 MB/s),因为那时它不需要寻道(将其磁头重新定位到另一个磁道并等待磁道旋转到适当的位置)。当需要搜索时,单个 HDD 可能会限制为每秒 200 次搜索。因此,如果您写入 8 kB,然后寻找到另一个地方,您将从同一驱动器获得 1.56 MB/s(这是 200*8)。在这两种情况下,驱动器都会 100% 繁忙,但吞吐量存在明显差异(200 对 1.56)。对于 RAID0,多个驱动器在统计上提供每秒 n*200 次寻道。
这与 SSD 无关,在那种情况下,搜索几乎是即时的。
在初始阶段,你的数据文件不会写太多,因为所有的插入都进入了数据库缓存。重做日志总是立即写入,没有(太多)缓冲,它很快,它是顺序的。redo log没有错。一段时间后,您只是用完了可用缓存,数据库编写器尝试通过写入数据文件来释放一些缓存。如果您只插入一个表空间中的一个表,则数据文件可能会按顺序或半顺序写入。
那么为什么要随机操作呢?好吧,您可能在数据库中有一些额外的东西,例如:索引、分区、审计、其他表等。所有这些都有助于随机化。
将每个顺序操作分开发生在一组不同的物理硬盘驱动器上,并将所有随机操作放在另一组物理驱动器上将是有益的。否则顺序性能将受到严重影响。在您的情况下,在性能方面,将重做文件与数据文件放在同一物理硬盘驱动器上是不好的。
有关更多信息,最好检查自动工作负载存储库 (AWR) 快照(这些是简单的文本报告)。