スケーラブルデータベースサーバ HiRDB Version 8 システム導入・設計ガイド(Windows(R)用)

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

13.2.2 コストベースの最適化を考慮したインデクスの作成

HiRDBは,ある表にインデクスが複数作成されている場合,表の検索で指定された探索条件を基にして,最もアクセスコストの少ないインデクスを選択します。このようにインデクスを選択する処理をコストベースの最適化といいます。

HiRDBが見積もるアクセスコストを次に示します。

HiRDBはコストベースの最適化をするため,表の検索性能が良くなります。特に,複雑な探索条件を指定したSQL文を実行する場合でも,表の検索性能を低下させません。

<この項の構成>
(1) コストベースの最適化を考慮したインデクスの作成基準

(1) コストベースの最適化を考慮したインデクスの作成基準

HiRDBはコストベースの最適化をするため,HiRDBが使用するインデクスの優先順位を意識しないでUAPを作成できます。ただし,UAPからアクセスする表に対してどのようにインデクスを作成しておくかについては,あらかじめ検討する必要があります。

コストベースの最適化を考慮するには,HiRDBが使用するインデクスの優先順位を考慮してインデクスを作成します。このとき,次に示す単一列インデクスと複数列インデクスの使い分け,複数のインデクスの使用及びインデクスの数が性能に与える影響も考慮してください。

HiRDBが使用するインデクスの優先順位を次の表に示します。

表13-2 HiRDBが使用するインデクスの優先順位

優先順位 HiRDBが優先して使用するインデクスの内容 インデクスがある列(C1)に対する条件の指定例
1
(必ず使用する※1
インデクス型プラグイン専用関数の条件が
「IS TRUE」であり,この関数の第一引数の列に指定したプラグインインデクス
contains(C1,'…') IS TRUE
構造化繰返し述語の探索条件に含まれるすべての列をインデクス構成列に含むインデクス ARRAY(C1,C2)[ANY]
 (C1='ABC' and C2=10)
C1,C2の複数列インデクスを定義しています。
2 プラグイン提供関数の条件が「IS TRUE」であり,この関数の第一引数の列に指定したプラグインインデクス within(C1,'…') IS TRUE
3 「=」の制限条件の対象になる列にある,UNIQUEを指定したインデクス C1=100
4 「=」の制限条件の対象になる列にあるインデクス C1=100
5 「IS NULL」の制限条件の対象になる列にあるインデクス※2 C1 IS NULL
6 LIKE述語,又はSIMILAR述語のパターン文字列に定数で「%」による前方一致比較を指定した列にあるインデクス C1 LIKE 'ABC%'
C1 SIMILAR TO 'ABC%'
7 LIKE述語,又はSIMILAR述語のパターン文字列に定数で上記以外の前方一致比較を指定した列にあるインデクス C1 LIKE 'ABC_'
C1 SIMILAR TO 'ABC_'
8 IN述語の制限条件の対象になる列にあるインデクス C1 IN(10,20,30)
9 BETWEEN述語の制限条件の対象になる列にあるインデクス C1 BETWEEN 20 AND 40
範囲条件を指定した列にあるインデクス 20<=C1 AND C1<=40
10 外への参照がない副問合せを使用したIN述語の制限条件の対象になる列にある単一列インデクス C1 IN(SELECT C1 FROM T2)
外への参照がない副問合せを使用した限定述語「=ANY」又は「=SOME」の制限条件の対象になる列にある単一列インデクス C1=ANY(SELECT C1 FROM T2)
C1=SOME(SELECT C1 FROM T2)
11 >,>=,<及び<=の制限条件の対象になる列にあるインデクス C1>50
C1<=200
12※3 スカラ演算(システム定義スカラ関数,IS_USER_CONTAINED_IN_HDS_GROUPは除く)を指定した列にあるインデクス※2 length(C1)=10
13 NOT BETWEEN述語の制限条件の対象になる列にあるインデクス C1 NOT BETWEEN 10 AND 30
14 XLIKE述語及び上記以外のLIKE述語,又はSIMILAR述語の制限条件の対象になる列にあるインデクス C1 XLIKE '%ABC%'
C1 LIKE '%ABC%'
C1 SIMILAR TO '%ABC%'
15 集合関数(MIN又はMAX)の引数に指定した列にあるインデクス※4 MIN(C1)
MAX(C1)
16 結合条件列及びグループ分け又はソートの対象になる列にあるインデクス ORDER BY C1
否定(NOT BETWEENを除く)の制限条件の対象になる列にあるインデクス C1 NOT LIKE '%ABC%'
C1 IS NOT NULL
上記以外の限定述語「ANY」又は「SOME」の制限条件の対象になる列にあるインデクス C1>=ANY(SELECT C1 FROM T2)
C1>SOME(SELECT C1 FROM T2)
限定述語「ALL」の制限条件の対象になる列にあるインデクス C1>ALL(SELECT C1 FROM T2)
プラグイン提供関数の条件が「IS FALSE」又は
「IS UNKNOWN」であり,この関数の第一引数の列に指定したプラグインインデクス
within(C1,'…') IS FALSE

(凡例)−:使用しないインデクスを示します。

  1. 関数呼出し「contains」は,HiRDB Text Search Plug-inが提供するプラグインの関数です。
  2. 関数呼出し「within」は,HiRDB Spatial Search Plug-inが提供するプラグインの関数です。
  3. 外への参照がある副問合せを含む制限条件の対象になる列にあるインデクスは使用できません。
  4. OR演算子で両側の条件式にインデクスを利用できる場合は,優先度がその条件式中の述語によって変わります。
  5. 制限条件とは,結合条件以外の探索条件のことです。
  6. 定義したインデクスが有効に利用できないとHiRDBが判断した場合は,該当するインデクスが使用されない場合があります。

注※1
このインデクスを定義していないと,実行できないでエラーとなります。必ず定義してください。

注※2
次の列に対して,ナル値を除外キーとするインデクスは使用しません。
  • 「IS NULL」の制限条件を指定した列
  • 制限条件中の「VALUE」及び「CASE式」に指定した列
  • 制限条件中の「BIT_AND_TEST」に対して「IS UNKNOWN」,「IS NOT TRUE」,又は「IS NOT FALSE」を指定し,この「BIT_AND_TEST」に指定した列
ただし,上記以外の制限条件を指定しているインデクスは使用します。その場合のナル値を除外キーとするインデクスの使用有無を表13-3に示します。

注※3
SQL最適化オプションに「スカラ演算を含むキー条件の適用」を指定した場合だけ,インデクスを優先して使用します。SQL最適化オプションの詳細は,マニュアル「HiRDB Version 8 UAP開発ガイド」を参照してください。また,述語の種類によっては優先順位が下がることもあります。否定が含まれない場合の優先順位は12〜14の範囲になります。否定が含まれる場合の優先順位は12〜−の範囲になります。

注※4
表の指定が一つで,GROUP BYを指定していないSQL文の場合は,集合関数(MIN又はMAX)だけを指定して,次に示すどれかの条件を満たすときに引数に指定した列のインデクスを使用します。
  • 集合関数の引数に指定した列が,単一列インデクスの構成列の場合
  • 集合関数の引数に指定した列が,除外キーを持たない複数列インデクスの第n構成列の場合で,第1構成列から第(n−1)構成列までに「=」又は「IS NULL」を指定したとき
  • 集合関数の引数に指定した列が,除外キーを持つ複数列インデクスの第n構成列の場合で,第1構成列から第(n−1)構成列までに「=」を指定したとき

    表13-3 ナル値を除外キーとするインデクスの使用有無

    構成列に指定する制限条件 使用有無
    IS NULL,VALUE,CASE式,BIT_AND_TEST IS NULL,VALUE,CASE式,BIT_AND_TEST以外※1
    指定あり 指定あり 使用します
    指定あり 指定なし 使用しません
    指定なし 指定あり 使用します※2
    指定なし 指定なし 使用しません※3
注※1
表13-2 HiRDBが使用するインデクスの優先順位」に示す優先順位の3〜14の制限条件の場合です。
注※2
インデクスが有効に利用できない場合などは,HiRDBが判断してインデクスを使用しないことがあります。
注※3
次に示すすべての条件を満たす検索では使用します。
  • 選択式が,インデクス構成列を引数とする集合関数だけ
  • FROM句には,一つの表だけ指定している
  • WHERE句の指定がない

表13-2 HiRDBが使用するインデクスの優先順位」に示すインデクスの優先順位でインデクスを作成しておくと,この優先順位でSQL文中に指定した探索条件での絞り込みの効果が期待できます。なお,優先順位の高いインデクスを作成していても,コストベースの最適化によってHiRDBがコストが高いと判断すると,このインデクスが使用されないことがあります。