インデクスとは
インデクスとはデータの検索時間を向上させるために、
特定列の値と行が格納されている場所をセットで記憶したものです。
インデクスはテーブルのとは異なり、B-Treeというデータ構造でデータを持っています。
SQLServerのクラスタ化インデクスを例にとり図にすると以下のようになります。
『クラスタ化』とは似たような値が近くに保存されるようにデータをソートして格納することです。
よって『クラスタ化インデクス』はインデクスに指定された列の値をソートした順番と
実データが同じ順番になって格納されています。
インデクスのデータには指定された列の値とそれが格納されている場所を保持しており、
指定された列の値は昇順(または降順)となるように格納されています。
上記例でデータ3を探す場合を例にし、検索内容を記述してみますと、
(1)ルートノードのデータを見て、対象のデータ3よりも大きい数値(データ5)があるので、左、真ん中、右の順での中間ノードを見に行きます。
(2)-1 左の中間ノードのデータ2は対象のデータ3よりも小さいため、左の中間ノードにつながっているデータは見にいきません。
(2)-2真ん中の中間ノードのデータ4は対象のデータ3よりも大きいため、中間ノードにつながっているデータを見に行きます。
(3)つながっているデータの1つ目がデータ3なので、そこに格納されているデータを見ます。
この例ですとデータは合計5件あるのですが、インデクスを使用したことにより、データ3の1件しか読んでいません。
処理の途中で読み込んでいた、ルートノードや中間ノードのデータは、指定された列の値しか持たず、
行のデータよりもサイズが小さくなっているので、
例ですと3回(ノード1回、中間ノード2回)読み込んでいますが、データを読み込むよりも早いといえます。
クラスタ化インデクスと非クラスタ化インデクス
通常インデクスは列の値で昇順、降順が決まっていますが、データに対して昇順、降順が決まるというものではありません。
ただし、
クラスタ化をすると、データに対しても昇順、降順の指定が有効になり、
データも並び替えられて格納されています。
まとめますと
非クラスタ化インデクスはインデクスキーとなる列の値が指定された順序に並び替えられても、データは並び替えられない。
クラスタ化インデクスはインデクスキーとデータ両方とも指定された順序に並び替えられる。
となります。