fc2ブログ

Home > db2 > db2dartで学ぶDB2ストレージ・アーキテクチャ その1

db2dartで学ぶDB2ストレージ・アーキテクチャ その1

  • Posted by: Nakunaru
  • 2012-06-03 Sun 17:15:44
  • db2
db2dartで学ぶDB2ストレージ・アーキテクチャ その1 表スペース内のエクステントについて
db2dartで学ぶDB2ストレージ・アーキテクチャ その2 SMPの拡張タイミングについて


最近、DB2絡みのお仕事が回ってきているので暇を見つけて勉強しております。
その中で、DB2がエクステントを確保する仕組みについて、いくつか気になる点があったので調べてみました。
そして、調べていく過程でdb2dartというツールの存在を知り、さらに色々と掘り下げてみたところ他社製品(というかORACLE)とは領域の扱い方が違う点などを発見できたので、少しずつまとめてみたいと思います。





とりあえず、基本的なエクステント管理の仕組みについて確認したあとで、内部のエクステント・マップを確認する方法などを紹介したいと思っています。
多分、1回のエントリーでは書ききれないので、複数回になる予定です。
ということで、今回は「その1」としました。

では、以下から本題です。



DB2の表スペース

Oracleなど表領域、テーブルスペースといった呼び方になりますが、DB2の文化圏では「表スペース」と呼ばれています。
基本的な概念はOracleと同じで、"表スペース"という論理構造に対し、"コンテナー"という物理構造を割り当て、データを格納するために使用するというものですね。
"コンテナー"という言い方なのは、ファイルだけでなく、デバイスやディレクトリも使用できるため、「データファイル」とは呼ばずに"コンテナー"になります。

tablespace.png







SMSとDMS

で、この表スペースは大きく2種類に分類ができて、「SMS表スペース」と「DMS表スペース」になります。
SMSは、コンテナーとしてディレクトリを使用し、領域管理はOSに投げっぱなしとなります。
DMSはDB2が領域管理を行い、コンテナーとしてデータファイルまたはデバイスが使用できます。
SMSの場合、この後書く予定の内部動作がかなり違っていますのでご了承ください。
今回はDMSを前提として調査を行なっています




ページ、エクステント、コンテナー

最初に基本的な用語を確認しておきます。
DB2も他の製品と同じように、I/Oの最小単位は「ページ」になります。
Oracleでは「データ・ブロック」と呼んでいるものですね。
ページ・サイズは表スペース毎に指定が可能で、それぞれ4K, 8K, 16K, 32K のいずれかになります。
デフォルトは4Kです。

そして、このページが連続する1つの固まりがエクステントになります。
エクステントは、表スペース内で、オブジェクトに領域が割り当てられる際の単位となり、デフォルトでは1エクステント32ページになります。

コンテナーは、表スペースに割り当てられたデータファイル、あるいはデバイスなどのことになります。

ということで、マニュアルでいうとこちら(http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=%2Fcom.ibm.db2.luw.admin.dbobj.doc%2Fdoc%2Fc0004939.html&resultof=%22SMP%22%20%22smp%22%20)にひと通りの説明があります。




エクステント・マップの確認(db2dart)

この中に色々と気になる点があるのですが、とりあえず最初の疑問点として、エクステントの状態を確認できないのか?ということです。
Oracleでは、dba_segments や db_extents を検索することで、オブジェクト毎のエクステントの位置が確認できます。
db2でも、

db2 list tablespaces show detail


を叩くことで、表スペース内にエクステントがいくつ確保され、あと何ページの空きがあるのかということはわかりますが、表毎にエクステントが連続領域に取られているのか、断片化しているのかということは、このコマンドでは判別できません。
そこで、エクステントの状態を確認する方法がないかマニュアルを漁ってみると、db2dartというツールを見つけました。
http://publib.boulder.ibm.com/infocenter/db2luw/v9r5/index.jsp?topic=%2Fcom.ibm.db2.luw.admin.cmd.doc%2Fdoc%2Fr0003477.html&resultof=%22db2dart%22%20

このツールは、コンテナーのファイルが壊れていないかを検査できる、ということなのですが、それ以外に表スペースの情報やページなどをダンプとして吐き出す機能を持っています。
マニュアルにはあまり詳しい説明がないので、試行錯誤しながらの調査でしたが、こいつを使ってエクステント・マップを確認することができました。

とりあえず使い方、構文です。

db2dart <DB別名> /DEMP /OI <オブジェクトID> /TSI <表スペースID>


・DB別名:接続先のDBの名前を指定(ちょっと不正確な言い方ですがとりあえず)
・DEMP:表のEMP(エクステント・マップ・ページ)をダンプする
・/OI:表のオブジェクトIDを指定
・/TSI:表スペースのIDを指定
表のオブジェクトIDと表スペースIDは以下のSQLで予め確認しておくこと。

db2 "SELECT tabname, tableid, tbspaceid FROM syscat.tables WHERE tabname='XXXXXX'"




サンプルコード
-- 表スペース作成
db2 "create large tablespace spmtbs managed by database using(file 'spmtbs.dat' 10000) autoresize yes extentsize 4"

-- 表作成
db2 "create table big_tab1(a varchar(3000)) in spmtbs"

-- データ増幅
db2 "insert into big_tab1 values('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')"
db2 "update big_tab1 set a = replace(a, 'a', 'aaaaaaaaaa')"
db2 "update big_tab1 set a = replace(a, 'a', 'aaaaaaaaaa')"
db2 "insert into big_tab1 select * from big_tab1" -- 2 rows
db2 "insert into big_tab1 select * from big_tab1" -- 4 rows
 ・・・

-- db2dart実行
db2 terminate
db2dart sample /DEMP /OI 4 /TSI 7

-- Object specific mapping info:
-- -----------------------------
-- DAT extent anchor: 12
-- Traversing extent map for object type: 0
-- Pool: 7, Object: 4 EMP page class: 64,
-- EMP pool page: 12, # entries: 1000
-- Page LSN = 0001 3B37 FE46
-- Pool relative page #'s :
-- 16 20 24 28 32
-- 36 40 44 48 52
-- 〜〜中略〜〜
-- 520380 520384 520388 520392 520396
-- 520400 520404 520408 520412 520416
-- 520420 520424
-- 〜〜後略〜〜


解説

今回は1エクステント4ページの表スペースを作成しました。
表スペースを作成した時点で、内部では4つのエクステントが取られています。

エクステントID 開始ページ番号 終了ページ番号 役割
------------------------------------------------------
なし なし なし コンテナー・タグ
0 0 3 表スペース・ヘッダー
1 4 7 SMP(スペース・マップ・ページ)
2 8 11 オブジェクト表データ

コンテナー毎に、1エクステントのヘッダー領域が取られます。
でも、list tablespaces show detail やその他表スペース関連の情報を取得するコマンドでは、このコンテナー・タグの情報は出力されません。
問答無用で1エクステント削られます。
更に言うと、各エクステントには、エクステントIDが振られていますが、コンテナー・タグには割り振られません。そして、コンテナー内のページにもページIDが振られますが、コンテナー・タグの持つページにはIDがありません。
その後ろに来るのが表スペースのヘッダー情報。
その後ろが、SMP(スペース・マップ・ページ)で、これは表スペース内の空きエクステントの情報を持っています。(後ほどコレについても検証する予定)
オブジェクト表データというのは、この表スペース内に格納されているオブジェクトの情報を持つエクステント。
ということで、4エクステントが取られているわけです。

そんで、表スペースの中に表を1つ作成すると、表のヘッダーエクステントと、データ用のエクステントの2つが最初に取られます。
このヘッダーのエクステントが、EMP(エクステント・マップ・ページ)で、表のエクステント・マップが格納されているらしいです。


エクステントID 開始ページ番号 終了ページ番号 役割
------------------------------------------------------
なし なし なし コンテナー・タグ
0 0 3 表スペース・ヘッダー
1 4 7 SMP(スペース・マップ・ページ)
2 8 11 オブジェクト表データ
3 12 15 big_tab1のEMP
4 16 19 big_tab1のデータエクステント



そして表のデータを増やしていき、最初に確保したデータエクステントが満タンになると、1エクステントずつ拡張していきます。

エクステントID 開始ページ番号 終了ページ番号 役割
------------------------------------------------------
なし なし なし コンテナー・タグ
0 0 3 表スペース・ヘッダー
1 4 7 SMP(スペース・マップ・ページ)
2 8 11 オブジェクト表データ
3 12 15 big_tab1のEMP
4 16 19 big_tab1のデータエクステント
5 20 23 big_tab1のデータエクステント
・・・・


db2dart /DEMP の結果を見ていきます。

DAT extent anchor: 12


まず、ここが該当する表の最初に確保したEMPエクステントの開始ページ番号です。
今回は12番のページで始まるエクステントが、最初のEMPエクステントであることがわかります。


Pool: 7, Object: 4 EMP page class: 64,


Poolが表スペースのID、Object: 4 が表のID

EMP pool page: 12, # entries: 1000


12番のページから始まるEMPには、エクステント情報が1000個格納されているという意味。
ココらへんはまた後で詳しく検証する予定。

Pool relative page #'s :
16 20 24 28 32
36 40 44 48 52


ここに並んでいる数値が、この表のエクステントの開始ページ番号を表しています。
ということで、ここを見ればエクステントの配置がわかるということになります。


エクステント・マップを見たからどうだ、という話ではありませんが、これが確認できるとマニュアルに載っている様々な内部動作を、実際に確認し検証できます。
例えば、表スペース内の空きエクステント情報が入るSMPが溢れたら、どのように拡張されるのか。
今確認したEMPが溢れたらどうなるか。
ページ・サイズによって管理できるエクステント数は変わるのか。などなど…

そんなわけで、今後数回に渡りdb2dartを使って領域の使われ方を確認してきます。

あ、今回はdb2の9.1で検証しているのですが、バージョンによって内部構造は変わる可能性があります。
それと、9.1は既にサポート切れなので使用する際はご注意を。
それと、本ブログの内容は、あくまで個人的な見解ですのでご理解を。


スポンサーサイト



Comments: 0

Comment Form
サイト管理者にのみ通知する

Trackback+Pingback: 0

TrackBack URL for this entry
http://hitai.blog72.fc2.com/tb.php/93-8d0d069c
Listed below are links to weblogs that reference
db2dartで学ぶDB2ストレージ・アーキテクチャ その1 from ヒビコレショウジン

Home > db2 > db2dartで学ぶDB2ストレージ・アーキテクチャ その1

タグクラウド
Categories
Monthly
Recent Entries
Recent Comments
Recent Trackbacks
Appendix

Nakunaru

    Author:Nakunaru

    データベース(ORACLEとかSQL ServerとかDB2とかMySQLとか)とか技術者教育とかプログラムとか。
    気になる技術を少しずつ勉強していきます。


Return to page top