如何最好地优化Oracle数据库的写入?

如何在不影响读取的情况下最大限度地提高写入性能

一个好的开始是遵循Oracle的SAME方法 – Stripe和Mirror Everything。 这为您提供了一个很好的基础,您可以从中进一步进行更具体的改进。

同样的方法在以下PDF中:

http://www.oracle.com/technology/deploy/availability/pdf/oow2000_sane.pdf

Ask Tom有一个很好的讨论:

http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4433784236146

SAME的主要推动力之一是便于pipe理。 它将很多性能考虑传递给操作系统和底层存储层。 这个想法是,你的表空间文件已经遍布在存储arrays中的数十亿个磁盘上,所以在你周围的任何摆弄都没有什么帮助。 然而,一如既往,恶魔的细节。 将存储层视为一个黑盒子是很诱人的,但是您确实需要了解发生了什么,并且知道每个表空间文件下的内容。

从一个不想要触摸的configurationPOV – 检查您的索引。 如果您正在写入索引严重的表,请记住,每次写入行时,索引都将被更改。 索引越less,物理IO越less。

这显然会对阅读产生影响。

如果你有时间和容量,我发现将通用的表格分隔成特定的表空间,并确保/这些表空间存储在一个单独的RAID通道也有帮助,但这取决于你正在使用的硬件,并添加了一堆其他注意事项。

如果你真的有时间思考这个问题,那么购买和阅读Cary Millsaps的“优化Oracle性能” – 它的date(全部取决于你使用的是什么版本的Oracle),而是一个经典的。

在集群中进行设置,让您的应用程序指向特定的节点进行写入; 然后从集群本身读取。

实现同样的效果 – 分割和镜像前面的答案中提到的一切 – 是一个很好的默认策略。 特别是如果您担心写入性能会不惜一切代价避免RAID5,则会在维护奇偶校验信息的同时产生4倍的写入开销。 具有大容量内存caching的RAID5arrays可能会隐藏一段时间的开销,但是对于长时间的写入,最终会感觉到RAID 5的损失。

在优化写IO方面有很多事情要考虑,但是这里还有一些需要考虑的事情:

  • 确保条带中有足够的磁盘设备来支持IO速率。 您需要在条带中放置足够的磁盘以支持每秒所需的总IO数量,而不仅仅是要存储的GB数量。 只有部分数据完整时,磁盘才能提供更好的响应时间 – 磁盘的外部部分可以比内部部分提供更快的数据速度。 所以一般来说,你想在你的条纹中有稀疏的磁盘。

  • 避免IO比优化IO更好。 可避免写入IO的最大来源是用于sorting和散列操作的临时段IO。 正确确定PGA总目标的大小是避免这种情况的最好方法。

  • 确保所有的索引都有效 – 加快查询速度或强制执行主键或外键。 索引维护往往是写入IO的最大来源,所以不要有任何多余的索引。

  • 创build大量的重做日志。 这有助于避免日志在数据文件检查点完成之前循环时可能发生的日志切换开销和数据库延迟。 您可能还想将重做日志放在专用设备上或专用的细粒度条纹上。

  • 使用asynchronousIO。 如果您的数据文件在文件系统上(例如不是RAW或ASM),则将FILESYSTEMIO_OPTIONS设置为AYNCH或SETALL。 SETALL实现直接的IO以及asynchronousIO,这通常有助于写入,但可能会降低读取速度。

  • 如果您准备冒犯COMMIT的风险,可以更改COMMIT_WRITE(10g)或COMMIT_WAIT和COMMIT_LOGGING,以延迟或批处理发出提交时发生的IO。 确保你明白的含义,虽然; 如果你这样做,你可能会在数据库失败的情况下丢失一些事务。

  • 如果您有权访问应用程序代码,请确保正在使用数组插入,并且 – 也许 – 使用APPEND提示使用直接path插入。