btree index (9)

btree indexの構築

create index文でindexを作成するとき、btbuildが実行される。
btree indexの作成方法は以下の2通りがある。

(1)テーブルのデータをソートしてから、インデックスを構築する
(2)テーブルのデータを順番に、インデックスに挿入する

通常は(1)の方法でindexが作られる。(2)はbootstrapなど特別な状況で使われる。

btree indexの作成中の状態はBTBuildStateで保持する。(1)の方法のときは、BTBuildState->usefastをtrueにする。

    buildstate.usefast = (FastBuild && IsNormalProcessingMode());

btbuildではBTBuildStateを初期化したあと、IndexBuildHeapScanを実行している。

    /* do the heap scan */
    reltuples = IndexBuildHeapScan(heap, index, indexInfo,
                                   btbuildCallback, (void *) &buildstate);

IndexBuildHeapScanではテーブルからタプルを取り出して、1タプルごとにコールバック関数(btbuildCallback)を実行する。
btbuildCallbackではusefastの設定によって処理を変える。usefastのときはソート用のspoolに登録する。IndexBuildHeapScanが終わったら、_bt_leafbuildでspoolのデータからindexを構築していく。_bt_leafbuildではボトムアップ的にインデックスを構築する。タプルはソートされているので先頭のタプルをリーフページの一番左に登録し、以降のタプルはその右に追加していけばいい。リーフページが一杯になったらページを分割し、親ページを追加する。

!usefastの場合は_bt_doinsertでindexに登録する。これはinsert文と同じ処理を行う。