photo credit: Tramonto - Sunset via photopin (license)
はじめに
OracleのインデックスをダンプできるTreeDump機能を使ってみました。
テスト用のテーブル
CREATE TABLE T_GAKUSEI ( gakusekiNo NUMBER,--学籍番号 classNo NUMBER,--クラスid name VARCHAR2(200),--指名 furigana VARCHAR2(200)--ふりがな );
学籍番号とクラスidに複合インデックスを作成します。
CREATE INDEX idx01_T_GAKUSEI ON T_GAKUSEI(gakusekiNo, classNo);
学生が1000人いるとして、データを挿入していきます。クラスidは1〜5組をランダムで振り分けています。
INSERT /*+ APPEND */ INTO T_GAKUSEI nologging ( gakusekiNo, classNo, name, furigana ) (SELECT 1*rownum, ROUND(dbms_random.value(1, 5), 0), concat('学生 太郎', TO_MULTI_BYTE(1 *rownum)), concat('がくせい たろう', TO_MULTI_BYTE(1*rownum)) FROM (SELECT 0 FROM all_catalog WHERE rownum <= 100 ), (SELECT 0 FROM all_catalog WHERE rownum <= 10 ) ); COMMIT;
TreeDump機能を使う
1.インデックスのTreeDump機能を使うには、インデックスのオブジェクトIDを調べないといけません。
以下のクエリで、インデックスのオブジェクトIDを知ることができます。
SELECT OBJECT_NAME,OBJECT_ID FROM USER_OBJECTS WHERE OBJECT_TYPE = 'INDEX' ;
2.続いて、dumpファイルの出力先を確認しておきます。user_dump_destパラメタのパスを覚えておきます。
conn sys/sys_password as sysdba show parameter user_dump_dest
3.さきほど調べたオブジェクトID(92564)を指定して、以下のクエリを実行すると、user_dump_destのパスにxxxx.trcファイルが出力されます。
conn sys/sys_password as sysdba ALTER SESSION SET EVENTS 'IMMEDIATE TRACE NAME TREEDUMP LEVEL 92564' ;
trcファイルが出力されました。
TreeDumpを見てみる
begin tree dump〜end tree dumpまでがインデックスのダンプです。
----- begin tree dump branch: 0x24000b3 37748915 (0: nrow: 3, level: 1) leaf: 0x24000b5 37748917 (-1: nrow: 450 rrow: 450) leaf: 0x24000b6 37748918 (0: nrow: 444 rrow: 444) leaf: 0x24000b7 37748919 (1: nrow: 106 rrow: 106) ----- end tree dump
branchはBツリーの枝の部分で、0x24000b5(=10進数で37748917)はアドレスを示しています。
nrowは格納レコード数で3個のレコードがあり、levelは階層で1階層目の枝です。
leafはBツリーの葉の部分で、アドレスが0x24000b5 (=10進数で37748917)です。
nrowが最大格納レコード数で、rrowが実際に格納されているレコードで450/450個レコードが格納されています。
図にするとこんな感じです。
以上が、インデックスのTreeDump機能の使い方でした。