Oracle 9i 関する検証 その1
<Oracle 9i 関する検証 その1>
ペンネーム ちょびひげ
— データベース・バッファとブロックサイズ --
Oracleはチューニングをしなければ遅くて使えない。
なんて話はよく聞かれる。
Oracleがメモリ上にキャッシングする領域(System Global Area)管理もその1つ
である。今回から、System Global Area(SGA)を構成する3つの領域の1つデータ
ベース・バッファキャッシュとブロックサイズについて検証して行きたい。
データベース・バッファキャッシュとは:
データベース・ブロックを格納するメモリ上の領域である。
最後に使用されたブロックをメモリ上に保持することにより、ディスクのI/Oが
減り、パフォーマンスが向上する。
LRUリストとダーティリストとは:
バッファ上のデータはLRUリスト(Least Recently Used List もっとも最後にア
クセスのあったブロックの順番リスト)で管理されている。つまり、もっとも長
い時間アクセスの無かったデータから、メモリからの追い出しが始まる。
また、LRUリスト内に更新ブロックが存在した場合は、LRUリストからダーティ
リストにブロックのエントリが移動される。
メモリ上のブロックはLRUリストかダーティリストのどちらかに存在する。
バッファのサイズが小さすぎるとメモリ上に必要なデータがほとんど存在せず
、負荷の高いディスクI/Oが頻繁に発生しパフォーマンスが悪化する。データベ
ース・バッファのヒット率を定期的にチェックすることは、データベースを管
理する上で必須の作業と言えよう。
ハッシュチェーンリストとは:
データベース・バッファを更新する際に必要となるラッチを管理するリストで
ある。データベース・バッファの大きさが小さい場合メモリ上での競合が発生
し、cache buffer chain ラッチの競合が多発する。
Oracleはデータをブロックサイズの単位でメモリ上に確保する為、データベー
ス・バッファの単位もブロックサイズ単位である。8iまでは以下の式でデータ
ベース・バッファのサイズが決まる。
DB_BLOCK_SIZE × DB_BLOCK_BUFFERS
Oracle9iでは、テーブルスペースごとにブロックサイズ(DB_BLOCK_SIZE)を設定
出来る、マルチブロック・サイズをサポートしている。
それに伴って、複数のサイズのデータベース・バッファのサイズの設定が必要
となっている。
つまり、データベース・バッファの設定が、よりパフォーマンスに影響を与え
ると言えよう。
では、実際に9iで、デフォルト(create database の時に指定したサイズ)とは
別のブロックサイズのテーブルスペースを作成してみよう。
# 16Kのブロックサイズ(デフォルトは2K)を作成
SQL> create tablespace test datafile '/export/home/ora901/oraoraora/test.dbf' 2 size 10m blocksize 16k; * ERROR at line 1: ORA-29339: tablespace block size 16384 does not match configured block sizes
# 16kのバッファキャッシュが確保されていないことを確認
SQL> show parameter db_16k_cache_size NAME TYPE VALUE -------------------------------- ----------- --------------- db_16k_cache_size big integer 0
おーっとっとっと、データベース・バッファの領域設定を忘れてしまった。
では、データベース・バッファの領域を設定してもう一度やって見よう!
# 初期化パラメータファイルのdb_16k_cache_sizeを設定
db_16k_cache_size=34603008
# 16kのバッファキャッシュが確保されていることを確認
SQL> show parameter db_16k_cache_size NAME TYPE VALUE ------------------------------ ----------- -------------- db_16k_cache_size big integer 50331648
# 16Kのブロックサイズ(デフォルトは2K)を作成
SQL> create tablespace test datafile '/export/home/ora901/oraoraora/test.dbf' 2 size 10m blocksize 16k; Tablespace created.
今度は正常に作成された。
ちなみに初期化パラメータで指定した16Kのキャッシュ・バッファのサイズ(33MB)
と実際のサイズ(48MB)が異なっているが、これは、9iではグラニュルという単
位でSGAが管理されているため、データベース・バッファのサイズがグラニュル
単位に切り上げられているためである。
以上のことから、9iでは以下のパラメータによって、データベース・バッファ
の大きさが決まる。
DB_CACHE_SIZE + DB_nK_CACHE_SIZE (nKはブロックサイズ)
以上、桜満開の茅ヶ崎にて