Oracle Database
インデックス
サーチ…
前書き
ここでは、例を使用して異なるインデックスを説明します。インデックスのクエリパフォーマンスの向上、インデックスのDMLパフォーマンスの低下など
Bツリーインデックス
CREATE INDEX ord_customer_ix ON orders (customer_id);
デフォルトでは、何も言及しなければ、oracleはb-tree索引として索引を作成します。しかし、いつ使うべきかを知っておく必要があります。 Bツリーインデックスは、バイナリツリー形式でデータを格納します。私たちが知っているように、indexは、インデックス付きカラムの各値に対して何らかのエントリを格納するスキーマ・オブジェクトです。したがって、これらの列で検索が行われるたびに、そのレコードの正確な場所を索引でチェックして、高速にアクセスします。インデックス作成に関するいくつかの点:
- インデックスのエントリを検索するには、何らかのバイナリ検索アルゴリズムを使用します。
- データのカーディナリティが高い場合は、b-treeインデックスが使用するのに最適です。
- 索引はDMLを遅くします。各レコードと同様に、索引付き列の索引には1つのエントリが必要です。
- したがって、必要でない場合は、索引を作成しないでください。
ビットマップ索引
CREATE BITMAP INDEX
emp_bitmap_idx
ON index_demo (gender);
- ビットマップ索引は、 データ・カーディナリティが低い場合に使用されます。
- ここで、 Genderは基数が低いという価値があります。値は、男性、女性などです。
- ですから、検索中にこの3つの値のバイナリツリーを作成すると、不要なトラバースが発生します。
- ビットマップ構造では、索引付けされる表の各行に対して1つの列を持つ2次元配列が作成されます。各列は、ビットマップ索引内の別個の値を表します。この2次元配列は、インデックス内の各値にテーブル内の行数を掛けた値を表します。
- 行の検索時に、OracleはビットマップをRAMデータ・バッファに解凍して、一致する値がすばやくスキャンされるようにします。これらの一致する値は、Row-IDリストの形式でOracleに渡され、これらのRow-ID値は必要な情報に直接アクセスできます。
関数ベースインデックス
CREATE INDEX first_name_idx ON user_data (UPPER(first_name));
SELECT *
FROM user_data
WHERE UPPER(first_name) = 'JOHN2';
- 関数ベースのインデックスは、関数に基づいてインデックスを作成することを意味します。
- 検索(where句)では、頻繁に関数が使用される場合、その関数に基づいて索引を作成する方が良いでしょう。
- ここでは、この例では、検索のためにUpper()関数が使用されています。したがって、上位関数を使用してインデックスを作成する方がよいでしょう。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow