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文と同じ処理を行う。