【ORACLE】ブロックサイズによるI/O性能の違い

ここではORACLEデータベースでブロックサイズによるI/O性能の違いについて紹介しています。

DISK読取回数の多いSQLの確認方法については↓を参考にしてください。
>>【SQL】DISK読取回数の多いSQL(I/O負荷の高い)の確認する方法

ブロックサイズによるI/O性能の違い

過去に対応したシステムの性能が悪いので改善してほしいと依頼を受けたことがあります。

SQLの書き方に問題があったり、統計情報を取得していない、メモリ管理が出来ていないなど種々の問題がありました。

その中でも一番大きな問題が、DB_BLOCK_SIZEでした。

DB_BLOCK_SIZEとは

ブロックサイズとはORACLEがデータを読み込むときの単位です。

1ブロックの中に複数の行データが格納されているイメージです。
ブロックサイズはデータベース作成時に決めるもので、デフォルトは8KBです。
他にも2KB、4KB、8KB、16KB、32KBが選択可能です。

ブロックサイズが大きいことのメリットは、1度の読み込みで多くの行データを読み込めます。そのためI/O効率が上がります。

ブロックサイズが大きいことのデメリットは、取得する必要のない行データまで取得する可能性がありキャッシュメモリに本来必要のない行データがのってしまう可能性があります。

またI/O競合が発生しやすくなります。これらを考慮し、アプリケーション特性に合わせて適切なサイズを検討します。

通常はデフォルトの8KBでOK

大抵のシステムがブロックサイズをデフォルトの8KBで設定している中、当時担当したシステムは2KBで設定されていました。

単純に考えるとブロックサイズが2KBということは、1ブロックで読み込めるデータの量が8KBに比べて4分の1になるということです。
※もちろん実際には単純比較はできません。

2KBという数字はオンラインシステムのI/O競合を意識したものですが、あまり低すぎてI/O性能がパフォーマンス全体に影響していました。

システムを調査していくと、特にI/O競合が発生しそうな状態ではありませんでした。むしろオンライン画面のSQLで10MB以上のデータを取得することもあり2KBでは時間がかかりオンライン画面の性能要件を満たさない状況でした。

2KBと8KBで性能はどれくらい違うか

当時、実際にブロックサイズを変更して比較したところ、8KBの方が約2~3倍性能が高かったです。

単純に4倍にはなりませんでしたが、圧倒的にパフォーマンスは向上しました。

※ブロックサイズはデータベース作成時に決め、通常は変更できません。ただし、表領域単位には別のブロックサイズに変更することができます。表領域単位にブロックサイズを変更する場合は、キャッシュメモリ上に別のサイズのキャッシュ領域を設定する必要があります。

最後に

最後までお読みいただきありがとうございます。

SQLのチューニング方法は↓で紹介していますので参考にしてください。
>>SELECT文のSQLチューニング方法まとめ