ビットマップ・インデックスは特殊なタイプのインデックスで、既存のインデックス値に一致する一連の オブジェクト ID 値を表す一連のビット文字列を使用します。
Caché において、ビットマップ・インデックスには以下のような重要な機能があります。
• ビットマップは高圧縮されています。つまり、ビットマップ・インデックスは通常のインデックスに比 べ容量が非常に小さいため、ディスクおよびキャッシュの使用量を大幅に削減します。
• ビットマップ演算は、トランザクション処理に最適です。テーブルでビットマップ・インデックスを 使用すると、通常のインデックスを使用する場合に比べ、パフォーマンスが低下しません。
• ビットマップでの論理演算 (カウント、AND、OR) を使用すると、パフォーマンスが向上します。
• SQL エンジンは、ビットマップ・インデックスを駆使する、特別な最適化機能を備えています。
ビットマップ・インデックスは、以下の制限事項に従って通常のインデックスと同様に操作できます。
インデックス値は照合されており、複数のフィールドの結合に対しインデックスを作成できます。
6.3.1 ビットマップ・インデックス演算
ビットマップ・インデックスは以下のように動作します。多数の列を持つPersonテーブルがあるとし ます。
Person テーブル
このテーブルの各行には、システムにより ID 番号 (増加する整数値) が割り当てられます。ビットマッ プ・インデックスは、一連のビット文字列 (1 または 0 を含む文字列) を使用します。ビット文字列で は、ビットの順番の位置が、テーブルのインデックスの ID (行の番号) に対応します。上記の表で Stateが “NY” である場合を例にとると、ビット文字列の “NY” を含む行に対応する各位置には 1 が、その他の位置は 0 が入ります。
例えば、Stateのビットマップ・インデックスは以下の通りです。
State ビットマップ・インデックス
また、Ageは以下のようになります。
Age ビットマップ・インデックス
通常の演算にビットマップ・インデックスを使用する方法とは別に、SQL エンジンは、複数のインデッ クスの結合を使用した特別なセット・ベースの演算を、ビットマップ・インデックスを使用して効率的に 実行できます。例えば、ニューヨークに住む 24 歳以上にあてはまるPersonのすべてのインスタン スを得るために、SQL エンジンは Age と State の論理 AND を実行します。
複数のインデックスの使用
結果として得られたビットマップには、検索基準にあてはまるすべての行のセットが含まれます。SQL エンジンは、これを使用して行からデータを返します。
SQL エンジンは、ビットマップ・インデックスを以下の演算に使用します。
• 任意のテーブルの複数の条件について AND を実行
• 任意のテーブルの複数の条件について OR を実行
• 任意のテーブルの RANGE 条件
• 任意のテーブルの COUNT 演算
6.3.2 クラス定義を使用したビットマップ・インデックスの定義
Caché スタジオでは、標準インデックスの場合と同様に、新規インデックス・ウィザードまたはクラス定 義のテキストの編集により、ビットマップ・インデックス定義を追加できます。ただし、ビットマップ・イン デックスの場合は、インデックスの Type を “bitmap” に指定する必要があります。
ビットマップ・インデックス
Class MyApp.Person Extends %Persistent [ ClassType = persistent ] {
Index AgeIDX On Age [type = bitmap];
Property Name As %String;
Property Age As %Integer;
}
6.3.3 DDL を使用したビットマップ・インデックスの定義
テーブルの定義に DDL 文を使用している場合、以下の DDL コマンドを使用して、ビットマップ・イ ンデックスを生成および削除できます。
• CREATE INDEX
• DROP INDEX
これは、CREATE INDEX 文に BITMAP キーワードを追加する必要がある点以外は、通常のイン デックス生成とまったく同じです。
CREATE BITMAP INDEX AgeIDX ON TABLE Person (Age)
6.3.4 ビットマップ・インデックスにおける制限事項
ビットマップ・インデックスには以下のような制限事項があります。
• UNIQUE 列にビットマップ・インデックスを定義することはできません。
• ビットマップ・インデックスには、値を保存できません。
• システムに割り当てられた数値の ID 値を使用したテーブル (クラス) のみでビットマップ・イン デックスを定義できます。カスタム ID 値を定義する IDKEY 機能を使用したテーブルに対し、
ビットマップ・インデックスを定義できず、また親-子リレーションシップの子テーブルには、ビット マップ・インデックスを使用することもできまません。
6.3.5 インデックス・タイプの選択
以下は、ビットマップ・インデックス、または標準のインデックスの選択方法を示す一般的な指針で す。
通常、すべての種類のキーや参照のインデックスを作成するには、標準インデックスを使用します。
• 主キー
• 外部キー
• 一意のキー
• リレーションシップ
• 単純オブジェクト参照
上記以外の場合は、ご使用のテーブルはシステムに割り当てられた数値の ID 番号を使用している ため、ビットマップ・インデックスを使用します。
通常は、複数のプロパティに対するインデックスを使用せず、各プロパティに対し個別のインデック スを使用してください (SQL エンジンが AND や OR 操作を効率的に結合できるため)。例外 : プロ パティ (または、インデックスを結合させる必要がある複数のプロパティ) に 10,000 ~ 20,000 の個 別の値 (または値の組み合わせ) が含まれる場合、標準インデックスを使用してください。しかし、こ れらの値が不均一に分散されているため、多数の行に対する値の数が非常に少ない場合、ビット マップ・インデックスを使用した方が有利です。常に、インデックスによる要求の全体量が少しでも少 なくなる方法を使用します。