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

 私は現役のシステムエンジニアです。以前、システムの性能が悪いので改善してほしいと依頼を受け関わったシステムの話になります。SQLの書き方や統計情報を取得していないこと適切なメモリ管理がされていないことなど、様々な要因がありました。そんな中、DB_BLOCK_SIZEも問題がありました。

DB_BLOCK_SIZEとは

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

 ブロックサイズが大きいことのメリットは、1度の読み込みで多くの行データを読み込めます。そのためI/O効率が上がります。デメリットは、取得する必要のない行データまで取得する可能性がありキャッシュメモリに本来必要のない行データがのってしまう可能性があります。

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

関わったシステムのブロックサイズは2KB

 担当システムはI/O競合を意識して2KBで設定されていました。最近はOracleの内部構造も進化し、8KBでもI/O競合は発生しづらいので大抵の場合、8KB以上を使用することが多いです。

システム特性

 特にI/O競合が発生しそうなほどの負荷状況でもありませんでした。保険をかけて2KBにしたのだと思います。むしろオンライン画面のSQLで10MB以上のデータを取得することもあり2KBでは時間がかかり、オンライン画面の性能要件を満たさない状況でした。

2KBと8KBで性能比較

 ブロックサイズはデータベース作成時に決め、以後変更することは出来ません。ただし、表領域単位には別のサイズに変更することができます。
 
 ※ただしキャッシュメモリ上に別のサイズのキャッシュ領域を設定する必要があります。
 同じデータ、同じSQLで8KBで表領域を作り直したところ約2~3倍の性能向上が見られました。単純に4倍にはなりませんでしたが十分でした。

Oracle SQLチューニング パフォーマンス改善と事前対策に役立つ (DB selection) [ 加藤祥平 ]

価格:2,808円
(2018/11/19 19:23時点)