ORA-00374 ブロックサイズ32KB指定時のエラーについて。

ORA-00374 ブロックサイズ32KB指定時のエラーについて

 Oracle 11gリリース2 (11.2) for Windows(x64)で、DB_BLOCK_SIZEに32KBを指定したら、以下のようなエラーメッセージが表示された。結果から先にいうと、Windowsでは2KB〜16KBしか指定できないよ。ってことらしい。
 
 ORACLEでは、ブロック毎にI/Oが発生する。そのためチューニングする上で、DB_BLOCK_SIZEの値を変更する必要があった。
 ORACLE@DATABASEリファレンスからDB_BLOCK_SIZEの有効値を調べたところ「ただし、オペレーティング・システムによっては、さらに範囲が狭い場合がある。」と記載されていた。
 また「64ビットのオペレーティング・システムがサポートするDB_BLOCK_SIZEの最大値は32768です。」と記載されてあった。また、自分の持ってるORACLEの本にも同様の記述が書かれていた。

 この記述をみてしまうと、Windows(x64)の制限値がわかりずらい。一見、32KBを指定できそう。
調べたら、Windows(x64)には制限2KB〜16KBがあることがわかった。 Windows版のプラットフォームガイドを参照

 16KBを指定したら、問題なくDBを作成することができた。マニュアルが多すぎて、ソースにたどり着くまで時間がかかった。また検索しても、プラットフォーム毎の制限を書いてある記事がすくなかった。よって、記事を書くことにした。

DB_BLOCK_SIZEがOSによって異なることで発生する問題

 例えば、DB_BLOCK_SIZEが32KBで指定してあったUnixのOSから、Windows版に移行する。などがあった場合には、制限値による問題が起こる。その場合は、事前に、DB_BLOCK_SIZEの変更が可能か確認する必要があると思う。また、OSによって設定値の制限が異なるため、移行時はOS毎のマニュアルを参照する必要がある。

他OSのDB_BLOCK_SIZE

OracleDatabase管理者リファレンス11gリリース2 (11.2) for Linux and UNIX-Based Operating Systemsを参照したところ、
「DB_BLOCK_SIZEに設定できる最大値は、Linux x86の場合16KBです。その他のプラットフォームの場合、32KBです。」と記載されている。よって、以下のようになると思う。
※ UnixAIX,Solaris,HP-UX)によっても制限がある可能性があるため念のため確認したほうが良い。

Windows(x86、x64) 16KB
Linux or Unix(x86) 16KB
Linux or Unix(x64) 32KB

参考:DB_BLOCK_SIZE指定の判断基準

 DB_BLOCK_SIZEの正しい設定値は、データベースの処理特性や格納されるデータによって異なる。ランダムアクセス主体のOLTPやWebシステムでは索引検索による単一ブロックI/Oが主体になるため多ければいいってものじゃない。シーケンシャルが主体のDWHシステムの場合は、大きいほうが良い場合もあるでしょう。
以下のサイトがわかりやすく書いてあった。
OTN Japan - Oracle9i 物理設計:第1部 DB全体の設計