小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


【Oracle】インデックスのTreeDumpを取得してみる

f:id:replication:20150919111251j:plain
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' ;

f:id:replication:20150919102203p:plain
2.続いて、dumpファイルの出力先を確認しておきます。user_dump_destパラメタのパスを覚えておきます。

conn sys/sys_password as sysdba
show parameter user_dump_dest

f:id:replication:20150919102414p:plain
3.さきほど調べたオブジェクトID(92564)を指定して、以下のクエリを実行すると、user_dump_destのパスにxxxx.trcファイルが出力されます。

conn sys/sys_password as sysdba
ALTER SESSION SET EVENTS 'IMMEDIATE TRACE NAME TREEDUMP LEVEL 92564' ; 

f:id:replication:20150919102609p:plain
trcファイルが出力されました。
f:id:replication:20150919102727p:plain

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階層目の枝です。

f:id:replication:20150919103803j:plain
leafはBツリーの葉の部分で、アドレスが0x24000b5 (=10進数で37748917)です。
nrowが最大格納レコード数で、rrowが実際に格納されているレコードで450/450個レコードが格納されています。
図にするとこんな感じです。
f:id:replication:20150919110318j:plain

以上が、インデックスのTreeDump機能の使い方でした。