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

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

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

答案1

一个好的开始是遵循 Oracle 的 SAME 方法 - Stripe and 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 的主要驱动因素之一是易于管理。它将许多性能考虑因素转嫁给操作系统和底层存储层。其理念是,您的表空间文件已经分布在存储阵列中的无数个磁盘上,因此您在此基础上进行的任何调整都无济于事。然而,正如往常一样,魔鬼藏在细节中。将存储层视为黑匣子是诱人的,但您确实需要了解发生了什么,并知道每个表空间文件下有什么。

答案2

从不想触碰配置的角度来看 - 检查您的索引。如果您正在写入大量索引的表,请记住每次写入一行时,索引都会发生变化。索引越少,物理 IO 就越少。

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

如果您有时间和能力,我发现将常用的表分成特定的表空间并确保这些表空间存储在单独的 RAID 通道上也有帮助,但这取决于您使用的硬件并增加了许多其他考虑因素。

如果您确实有时间思考这个问题,那么请购买并阅读 Cary Millsaps 的《优化 Oracle 性能》 - 它虽然过时了(完全取决于您使用的 Oracle 版本),但却是经典之作。

答案3

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

答案4

实施 SAME(条带化和镜像所有内容,如上一个答案中建议的那样)是一种很好的默认策略。特别是如果您担心写入性能,请不惜一切代价避免使用 RAID5 - 它会产生 4 倍的写入开销,同时保持奇偶校验信息。具有大内存缓存的 RAID5 阵列可能会暂时隐藏该开销,但对于长时间的写入,最终会感受到 RAID 5 的损失。

在优化写入 IO 时需要考虑很多事情,但这里还有一些事情需要考虑:

  • 确保条带中有足够的磁盘设备来支持 IO 速率。您需要在条带中放置足够的磁盘来支持所需的每秒总 IO,而不仅仅是要存储的 GB 数。当磁盘仅部分充满数据时,其响应时间会更快 - 磁盘的外部可以比内部更快地传输数据。因此,一般来说,您希望条带中的磁盘分布稀疏。

  • 避免 IO 比优化 IO 更好。可避免的写入 IO 的最大来源是用于排序和哈希操作的临时段 IO。正确调整 PGA 聚合目标的大小是避免这种情况的最佳方法。

  • 确保所有索引都服务于有效目的 - 加速查询或强制主键或外键。索引维护通常是写入 IO 的最大来源,因此不要有任何多余的索引。

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

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

  • 如果您准备在 COMMIT 方面承担风险,您可以更改 COMMIT_WRITE (10g) 或 COMMIT_WAIT 和 COMMIT_LOGGING 以延迟或批量处理发出提交时发生的 IO。不过,请确保您了解其含义;如果这样做,在数据库发生故障时,您可能会丢失一些事务。

  • 如果您有权访问应用程序代码,请确保正在使用数组插入,并且 - 可能 - 使用 APPEND 提示使用直接路径插入。

相关内容