Joshua Asked: 2009-05-01 14:52:08 +0800 CST2009-05-01 14:52:08 +0800 CST 2009-05-01 14:52:08 +0800 CST 如何最好地优化 Oracle 数据库的写入? 772 如何在不影响读取的情况下最大化写入性能? performance oracle 4 个回答 Voted Mark Regensberg 2009-05-02T00:18:50+08:002009-05-02T00:18:50+08:00 从不想触摸配置的 POV - 检查您的索引。如果您正在写入索引过多的表,请记住每次写入一行时,索引都会被更改。更少的索引,更少的物理IO。 这显然会影响读取。 如果您有时间和容量,我发现将常用写入的表分离到特定的表空间并确保/那些表空间存储在单独的 RAID 通道上也有帮助,但这取决于您使用的硬件并添加了一堆其他考虑因素。 如果您确实有时间思考这一点,那么请购买并阅读 Cary Millsaps 的“优化 Oracle 性能”——它已经过时(完全取决于您使用的 Oracle 版本),但它是经典之作。 Best Answer Nick Pierpoint 2009-05-06T02:04:50+08:002009-05-06T02:04:50+08:00 一个好的开始是遵循 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 的主要驱动力之一是易于管理。它将许多性能考虑因素传递给操作系统和底层存储层。这个想法是,您的表空间文件已经分布在存储阵列中的无数磁盘上,因此您在此之上所做的任何摆弄都无济于事。然而,一如既往,魔鬼在细节中。将存储层视为黑匣子很诱人,但您确实需要了解正在发生的事情并知道每个表空间文件下的内容。 tsilb 2009-05-01T18:49:20+08:002009-05-01T18:49:20+08:00 将其设置在集群中,并让您的应用程序指向特定节点进行写入;然后从集群本身读取。 Guy Harrison 2009-06-07T03:34:34+08:002009-06-07T03:34:34+08:00 实施 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 提示使用直接路径插入。
从不想触摸配置的 POV - 检查您的索引。如果您正在写入索引过多的表,请记住每次写入一行时,索引都会被更改。更少的索引,更少的物理IO。
这显然会影响读取。
如果您有时间和容量,我发现将常用写入的表分离到特定的表空间并确保/那些表空间存储在单独的 RAID 通道上也有帮助,但这取决于您使用的硬件并添加了一堆其他考虑因素。
如果您确实有时间思考这一点,那么请购买并阅读 Cary Millsaps 的“优化 Oracle 性能”——它已经过时(完全取决于您使用的 Oracle 版本),但它是经典之作。
一个好的开始是遵循 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 的主要驱动力之一是易于管理。它将许多性能考虑因素传递给操作系统和底层存储层。这个想法是,您的表空间文件已经分布在存储阵列中的无数磁盘上,因此您在此之上所做的任何摆弄都无济于事。然而,一如既往,魔鬼在细节中。将存储层视为黑匣子很诱人,但您确实需要了解正在发生的事情并知道每个表空间文件下的内容。
将其设置在集群中,并让您的应用程序指向特定节点进行写入;然后从集群本身读取。
实施 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 提示使用直接路径插入。