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

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

「コアレス(coalesce)の動きを教えてほしい」、
「フリーブロックは、どのように確保されて、
どのようにしてテーブル等の領域として使われるのか」
というような質問が弊社に寄せられた。また、実際のサポート業務の中で尋ね
られることも少なくない。そこで、密接に関係するこれらを検証を交えながら
説明しようと思う。

まずは、「コアレス」から説明するが、一言でいってしまうと、空スペースの
フラグメンテーションを合体させる機能のことで、通常であれば、SMONが5分
ごとに自動的におこなう(以前は2時間ごとであった)。空スペースのフラグメ
ンテーションというのは、具体的に言うと、例えば物理的に隣り合って存在し
ていた10MのテーブルAと20MのテーブルBをDROPしたときスペースが開放させて、
空スペースになる。その隣り合っていた領域には、エクステント境界が残る。

例えば、この状態で、25MのテーブルCをつくろうとしても、領域がなくてつく
れない。そこでコアレスという機能が重要になってくる。簡単に言ってしまう
と、そのエクステント境界をなくしてしまうことだ。それにより30Mの空領域
を確保して、25MのテーブルCも作成できるようになる。(空領域が物理的に隣
り合っていないと当然コアレスしても結果は変わらない。ダイナミックに空領
域の配置を整理していたら、処理が重たくってしょうがない)では、どのよう
なタイミングでコアレスがおこるのか?

1.alter tablespace <テーブルスペース名> coalesce を発行したとき。
2.5分に一回smonが自動的に
(テーブルスペースのpctincrease 0以外を設定したテーブルスペースのみ)
3.pctincrease 0に設定したかしないに関わらず、コアレスしないとエクス
テントを割り当てる空領域が足りないとき

では、それぞれ、検証してみよう。
1.に関してはコアレスするのは当たり前であるが、オラクル内部でどのよう
なことがおきているか見てみよう。まずは、V$LOCK(DBA_OBJECTSのなかでは、
V_$LOCKがビューでV$LOCKはそのSYNONYM)というディクショナリーを調べてみ
よう。

ADDR      KADDR      SID  TYPE   ID1     ID2   LMODE  CTIME
-----------------------------------------------------------
01002F48  01003014   9    TX     131076  3480  6      0
8009634C  80096360   9    TM     12      0     3      0
80063FA8  80063FB8   9    ST     0       0     6      0

ID1、ID2はTYPEによって格納される情報は異なるが、TMはテーブルに対する更
新ロックを示し、ID1は、オブジェクトIDを示す。ID1は12になっているが、そ
のオブジェクトはFET$というテーブルで、フリースペースを管理しているテー
ブルである。よく使うDBA_FREE_SPACEビューは、FET$をもとにして作ったもの
である。TXは更新処理に対するロールバックの情報を示す。

通常updateするときは、TM,TXが一組でそれぞれLMODEが3(row exclusive),
6(exclusive)で取得される。もっと具体的にいうとTMのLMODE  3のほうはテー
ブルに対して表ロックをかけている状態で他のプロセスからalter table や
drop tableできない。TXのLMODE  6のほうは、ロールバックセグメント中のそ
のプロセスが使用している部分を他のプロセスに使われないようにしている。

このときの、ID1,ID2は、ロールバックセグメントの場所を示している。同じ行
をロックできないのは、このTXの6が取得されているからである。上記のV$LOCK
の例はその典型的な例で、FET$に対して更新をかけていることを示す。
TYPEがSTのものは、STエンキューのことで、インスタン上に1つしか存在しない。
truncateやダイレクトロード処理など領域マップを直接更新する必要のある処理
で取得されるロックであるが、コアレスの処理でも領域マップの更新をするので、
LMODEの6(exclusive)がかかっている。このロックがかかっていううちは、表
領域に対するどのような操作もできない。

STは、通常はほんの一瞬しかかからないので、問題になることはないが、もし、
LMODEの6でこのロックを長時間取得しているときがあれば、表領域に対して、
領域マップの更新ができなくなり、他の処理の妨げになることは言うまでもな
い。また、V$LOCKには、ctime(秒単位)という項目があり、どれくらいの時間
ロックを取得しているかわかる。V$LOCKでいろいろなことがわかるので、ぜひお
さえていただきたいディクショナリーである。
(詳しくは、弊社著書 ORACLE8  プロフェッショナルテクニックP210  ソフトリ
サーチセンター 参照)

また、他にこんな使い方をしているという例があれば、ぜひ、どしどしメールに
て教えていただきたい。それ以外にも、この記事によりなにかご質問等があれば、
次回以降の記事にどんどん反映していくので、ご意見をいただきたい。次回以降、
2.3.に関しても検証する。

以上  茅ヶ崎にて

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