フリーブロックに関する検証 その2

<フリーブロックに関する検証 その2>  ペンネーム ちゃむ

~~~~ 読者からの質問 ~~~~
読者の「きょん」さんからコアレスは自動発行されるのか?
Oracle のバージョンで動きは異なるのか?
という質問を受けました。今回の記事を読めば、理解していただけると思います。
~~~~~~~~~~~~~~~~

前回に引き続き、フリーブロックの検証をおこなう。コアレスをおこなうのは、
以下のタイミングである。
1.alter tablespace <テーブルスペース名> coalesce を発行したとき。
2.5分に一回smonが自動的に
(テーブルスペースのpctincrease 0以外を設定したテーブルスペース)
3.pctincrease 0に設定したかしないに関わらず、コアレスしないとエクス
テントを割り当てる空領域が足りないとき

前回は、1.に関して、このコマンドを実行したときのV$LOCKの動きなどを説
明した。今回は2.に関して検証を交えながら説明する。まずは、単純に、
pctincrease 0とpctincrease 0以外のときで5分以上時間を空けたときにコアレ
スするかしないかを確認してみる。
当然、検証を行う前にCREATE TABLEとDROP TABLE などをしてエクステント境界線
のあるフリーブロックを作っておく。つまり、フラグメントを発生させる。

結果は、やはりpctincrease 0のときは、コアレスしないが、pctincrease 0以外
のときはコアレスを行った。create tablespace,alter tablespace のdefault
storageで指定するpctincreaseは、2つの意味をもつ。一つ目は今検証した、コア
レスするかしないかを決めること。
二つ目は、create tableするとき、pctincreaseを指定しなかったらそのテーブル
を格納するtablespaceのpctincreaseをデフォルトで使用することである。

また、コアレスはあくまでも、表領域単位なので、TABLEでpctincreaseをいくつ
に指定したかに関わらず、表領域での、pctincreaseが0か0以外かで決まる。
では、次にsmonがコアレスする際に対象テーブルスペースを特定するために実行
するSQL文を見てみよう。以下は8.1の環境で取得したものである。

select f.file#, f.block#, f.ts#, f.length from fet$ f, ts$ t
where t.ts#=f.ts# and t.dflextpct!=0 and t.bitmapped=0

ちなみに、このsql文は、

SELECT SID,SQL_TEXT FROM V$SQL ,V$SESSION
WHERE ADDRESS = SQL_ADDRESS AND TYPE='BACKGROUND';

でBACKGROUNDで実行されているsql文を見ることができるので、やってみていた
だきたい。また、v$session_waitを見ることによって、300秒おきにつまり5分お
きにsmonが処理をしているというのを見ることができる。
下記のSID(セッションID)は上記でBACKGROUNDで実行さえれているSQL文のSIDと
一致する。

SID  SEQ#  EVENT  P1TEXT  P1
----------------------------------------
5    1457  smon   timer   sleep time 300

話をもとに戻して、コアレスする際に対象テーブルスペースを特定するためのS
QL文のwhere句のt.dflextpct!=0のところが、pctincrease 0以外のもので絞り込
んでいることをあらわす。
また、where句のt.bitmapped=0は、ts#テーブルの
項目であるが、実は、これは8.1からの新機能に関連する。create databaseを実
行するときにsql.bsq(oracle_home/rdbms/admin)が実行される。その中にこのts#
テーブルをつくるスクリプトがあるが、その中で、bitmappedは次のようなコメン
トがついている。/* If not bitmapped, 0 else unit size */

どうやら、ビットマップを使って表領域の管理をするようである。これでは、あ
まりよくわからないが、USER_TABLESPACESビューでEXTENT_MANAGEMENTという項目
はこのbitmappedをもとにdecode関数で次のように置きかえられている。

decode(ts.bitmapped, 0, ‘DICTIONARY’, ‘LOCAL’)
0なら’DICTIONARY’それ以外なら’LOCAL’。

これは、表領域が’DICTIONARY’か’LOCAL’かどちらのタイプかを表わす。
‘DICTIONARY’は従来のテーブルスペースであり、’LOCAL’はローカルエクステン
トマネージメントのテーブルスペースである。つまり、従来どおりの表領域であ
れば、コアレスするが、8.1からの新機能であるローカルエクステントマネージメ
ントのテーブルスペースはコアレスはしないことを意味する。

なお、ローカルエクステントマネージメントは8.1からの新機能なので、それ以前の
バージョンではSQL文のwhere 句は where t.ts#=f.ts# and t.dflextpct!=0までである。

ローカルエクステントマネージメントに関しては、もう少し後で別に切り出して検証
を交えて説明する。

8.1ではローカルエクステントマネージメントか従来どおりかはcreate tablespace
をする際の指定で決まる。ORACLE 8.1のsqlマニュアルのcreate tablespace文のと
ころや8.1の概要Vol1 に説明があるので参考にしていただきたい。

「きょん」さんこれでにコアレスに関してだいたいわかりましたね。
あと、SMONの自動コアレス機能は、検証したところ Oracle7.1.6以降であれば行
われています。(それ以前は確認してません)

以上 茅ヶ崎にて

~フリーブロックに関する検証 その2~
by ちゃむ