Oracle 9i 関する検証 その1

投稿日: 2002年3月27日

<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はブロックサイズ)

以上、桜満開の茅ヶ崎にて