高速トランザクション処理基盤 TP1/EE/Extended Data Cache 使用の手引

[目次][用語][索引][前へ][次へ]

3.3.1 インデクスを定義する列を決めるときの考慮点

適切な列にインデクスを定義すると表の検索性能が向上しますが,不適切な列にインデクスを定義すると,逆に性能低下の原因になります。

<この項の構成>
(1) インデクスの効果的な使い方
(2) インデクスを定義すると逆効果になる場合
(3) インデクスを定義しても効果が期待できない場合
(4) インデクスの定義が適切でない場合の問題点

(1) インデクスの効果的な使い方

ここでは,インデクスの効果的な使い方について説明します。

(a) 探索条件の評価に使う

WHERE句に指定された探索条件を評価するときにインデクスを使用すると,検索するページ数を削減できます。ただし,インデクスのキー値に重複が多い場合は,逆に検索するページ数が多くなることがあります。

(b) 表の結合検索に使う

表の結合検索を行うときにインデクスを使用すると,結合条件の評価回数(行の突き合わせ回数)を削減できます。結合検索の内表の列にインデクスが定義されていない場合,外表の各行に対して内表の全行が突き合わせ処理されます。

参考
  • 表の結合方式については,「4.3.2 表の結合方式」を参照してください。
  • FROM句の指定順に外表,内表となります。
(c) データをソートするときに使う

データをソートする場合(ORDER BY句が指定されている場合)に,ソート処理の代用としてインデクスを使用すると,ソート処理のオーバヘッドを削減できます。

インデクスを使用してソート処理を代用するには,ソートの指定順序とインデクス構成列の指定順序を合わせる必要があります。さらに昇順,降順の指定もすべて一致させるか,またはすべて逆にする必要があります。

ソートに複数の列を指定する場合については,「3.3.2 単一列インデクスと複数列インデクスの使い分け」を参照してください。

ただし,WHERE句と同時にORDER BY句を指定する場合,WHERE句の指定を優先して,検索時に使用するインデクスが決まるため,ソート処理のオーバヘッドを削減できないことがあります。

なお,ソート処理を代用するインデクスが定義されていない場合,作業表を作成してソート処理を行います。この場合,インデクスを使用したときに比べて性能が低下します。

(d) 集合関数の結果を取得するときに使う

集合関数のCOUNT(*)およびCOUNTで求めるデータ件数を取得するときに,インデクスを使用します。この機能を,集合関数の高速処理機能といいます。

集合関数の高速処理機能については,「4.3.5 集合関数の高速処理機能」を参照してください。

(e) インデクスを利用して列値を取得する

探索条件やソートの指定がない場合でも,検索する列をすべて含むインデクスが定義されているときは,列値の取り出しにインデクスが使用されます。この機能をキースキャンによる列値取得機能といいます。

キースキャンによる列値取得機能については,「4.3.6 キースキャンによる列値取得機能」を参照してください。

(2) インデクスを定義すると逆効果になる場合

次に示す条件に当てはまる列にインデクスを定義すると,逆に検索性能が低下します。

(3) インデクスを定義しても効果が期待できない場合

次に示す条件に当てはまる列にインデクスを定義しても効果は期待できません。

(4) インデクスの定義が適切でない場合の問題点

インデクスの定義が適切でないと次に示す問題が発生することがあります。

インデクスが効果的に使用されているかどうかは,アクセスパス情報で確認できます。アクセスパス情報については,「7.6 アクセスパス情報の表示」を参照してください。