適切な列にインデクスを定義すると表の検索性能が向上しますが,不適切な列にインデクスを定義すると,逆に性能低下の原因になります。
ここでは,インデクスの効果的な使い方について説明します。
WHERE句に指定された探索条件を評価するときにインデクスを使用すると,検索するページ数を削減できます。ただし,インデクスのキー値に重複が多い場合は,逆に検索するページ数が多くなることがあります。
表の結合検索を行うときにインデクスを使用すると,結合条件の評価回数(行の突き合わせ回数)を削減できます。結合検索の内表の列にインデクスが定義されていない場合,外表の各行に対して内表の全行が突き合わせ処理されます。
データをソートする場合(ORDER BY句が指定されている場合)に,ソート処理の代用としてインデクスを使用すると,ソート処理のオーバヘッドを削減できます。
インデクスを使用してソート処理を代用するには,ソートの指定順序とインデクス構成列の指定順序を合わせる必要があります。さらに昇順,降順の指定もすべて一致させるか,またはすべて逆にする必要があります。
ソートに複数の列を指定する場合については,「3.3.2 単一列インデクスと複数列インデクスの使い分け」を参照してください。
ただし,WHERE句と同時にORDER BY句を指定する場合,WHERE句の指定を優先して,検索時に使用するインデクスが決まるため,ソート処理のオーバヘッドを削減できないことがあります。
なお,ソート処理を代用するインデクスが定義されていない場合,作業表を作成してソート処理を行います。この場合,インデクスを使用したときに比べて性能が低下します。
集合関数のCOUNT(*)およびCOUNTで求めるデータ件数を取得するときに,インデクスを使用します。この機能を,集合関数の高速処理機能といいます。
集合関数の高速処理機能については,「4.3.5 集合関数の高速処理機能」を参照してください。
探索条件やソートの指定がない場合でも,検索する列をすべて含むインデクスが定義されているときは,列値の取り出しにインデクスが使用されます。この機能をキースキャンによる列値取得機能といいます。
キースキャンによる列値取得機能については,「4.3.6 キースキャンによる列値取得機能」を参照してください。
次に示す条件に当てはまる列にインデクスを定義すると,逆に検索性能が低下します。
次に示す条件に当てはまる列にインデクスを定義しても効果は期待できません。
インデクスの定義が適切でないと次に示す問題が発生することがあります。
インデクスが効果的に使用されているかどうかは,アクセスパス情報で確認できます。アクセスパス情報については,「7.6 アクセスパス情報の表示」を参照してください。