Bツリー・インデックスがある場合の実行プランを見ていきます。実行プランとは処理手続きですので,プログラミングをかじった方であれば,プログラム上の処理を思い浮かべてください。

 [顧客]テーブルの[顧客番号]カラムにBツリー・インデックスがあるとします(表1図1)。この特集では一つのブロックに3レコード含むとしていますので,[顧客]テーブルは10ブロックに格納されます。

表1●[顧客]テーブル
表1●[顧客]テーブル

図1●[顧客]テーブルの[顧客番号]カラムに付けたインデックス
図1●[顧客]テーブルの[顧客番号]カラムに付けたインデックス
一つのルート(,ブランチ,リーフ)に含まれるカラム値は,実際はもっと多い。だが基本的に,レコード数が多くなっても構造は同じである  [画像のクリックで拡大表示]

SELECT 顧客名 FROM 顧客 WHERE 顧客番号 = 1030
意味:[顧客番号]の値が1030である[顧客名]を抽出

 このSQL文を処理する場合,インデックスを使わない処理手続きと使う処理手続きが考えられます。インデックスを使わない処理手続きは,

<手続き1>([顧客]テーブルの全レコードに当たる)10ブロックをデータ・バッファに読み込み,[顧客番号]の値を判定して該当レコードを抽出

 となります。図2と併せて見てください。注目するのは,処理性能を大きく左右するディスク・アクセスの回数です。それが10回行われていることを確認してください。

図2●インデックスを使わない処理手続き
図2●インデックスを使わない処理の手続き

 一方の,インデックスを使う処理手続きは,

<手続き2>Bツリー・インデックスのルート,ブランチ,リーフを,それぞれデータ・バッファに読み込む。リーフのポインタからレコードのブロックを読み込み,該当レコードを抽出

 となります。図3と併せて見てください。注目すべきディスク・アクセスの回数は4回です。手続き1と比べて手続き2のディスク・アクセス回数は半分以下ですので,インデックスを使う手続き2の方が最適な手続きと言えるでしょう。つまり,実行プランとして,おそらく手続き2が選ばれるということです。

図3●インデックスを使う処理手続き
図3●インデックスを使う処理手続き

監修:藤塚 勤也(ふじづか きんや) NTTデータ 基盤システム事業本部 オープンソース開発センタ 技術開発担当 シニアスペシャリスト
沖電気工業,タンデムコンピューターズ(現日本HP)を経て,2003年より株式会社 NTTデータに勤務。現在は,オープンソース・ソフトウエアを活用したエンタープライズ・システム向けの技術開発・技術支援に従事しており,特にシステムの中核であるRDBMSに注力している。「RDBMS解剖学」(翔泳社)を共著