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

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

>>SQLが突然遅くなる原因と対応方法

>>ORACLEチューニング関連記事の一覧

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でお困りの方にオススメ】
■SQLが遅くなる原因
・SQLが突然遅くなる原因と対応方法
・OracleSQLのレスポンスが遅い原因3つ
・JOINを使って表結合するとSQLが遅い!?
・SQLがパラレル実行されない原因

■SQLチューニングの基礎知識
・ORACLE SQLのヒントとは
・ORACLEのオプティマイザと実行計画について
・ORACLEのテーブルやインデックスの「統計情報」とは

■SQLチューニングの方法
・SELECT文のSQLチューニング方法
・OracleExadataでのSQLチューニング方法
・SLECT文が遅いときのインデックス作成によるチューニング方法
・INSERT文のSQLチューニング方法
・Update文が遅いときのチューニング方法
・Delete文が遅いときのチューニング方法
・IN句をEXISTS句に置き換えするチューニング方法
・OR句の置き換えによるチューニング方法
・IN句の置き換えによるチューニング方法
・テーブルアクセスフルスキャンを無くしてチューニングする方法
・SQLでGROUP BYが遅いときのチューニング方法
・SQLのソート処理が遅い場合のチューニング方法

■表や索引の断片化対策
・プロが教えるORACLEの表や索引の断片化解消の見積り方法
・ORACLE表の断片化を解消する3つの方法

■SQLのチューニングの補足情報
・ORACLE SQLヒントの書き方
・SQLに複数のヒントの書き方
・OracleSQLに実装すべき3つのSQLヒント
・ORACLE表の統計情報取得日の確認方法
・「統計情報が古い」とはどういうことか
・ORACLE表の統計情報の取得方法

【自己学習したい方にオススメ】
・自宅で勉強用にORACLEデータベースを無償でダウンロードし構築する方法
・OracleMasterGold12cに一ヵ月で合格した勉強方法
・OracleMasterExpertパフォーマンス&チューニングに一ヵ月で合格した勉強方法
・手に職がない人はIT業界へ、オススメ資格と勉強方法
・OracleDBのチューニング勉強方法
・OraclePL/SQL勉強方法