Hitachi

Hitachi Advanced Data Binder AP開発ガイド


5.2.3 表の検索時に使用されるインデクスの例(インデクスの優先順位の例)

表に複数のインデクスが定義されている場合,「表5‒1 表に複数のインデクスが定義されている場合のインデクスの優先順位」に示す優先順位に従って,使用されるインデクスが決定されます。

ここでは,表の検索時に使用されるインデクスの優先順位の例(代表的な例)を説明します。

検索時に実際に使用されるインデクスを確認したい場合は,「5.2.5 SQL文の実行時に使用されるインデクスを確認する方法」を参照してください。

〈この項の構成〉

(1) 例1(単一列インデクス同士の優先順位)

B-treeインデクス(単一列インデクス)同士の優先順位の例を説明します。

B-treeインデクスの定義例:

 CREATE INDEX "IDX_C1"
       ON "T1" ("C1")
     IN "DBAREA01"
     EMPTY
 
 CREATE INDEX "IDX_C2"
       ON "T1" ("C2")
     IN "DBAREA01"
     EMPTY

実行するSELECT文の例:

 SELECT "C1","C2","C3" FROM "T1"
     WHERE "C1">100 AND "C2"='U0100'

この場合,B-treeインデクスIDX_C1の優先順位は15になり,B-treeインデクスIDX_C2の優先順位は2になります。したがって,B-treeインデクスIDX_C2が検索時に使用されます。

重要

上記のケースで,優先順位に従ってどちらかのB-treeインデクスだけが使用される場合,絞り込みがより効くB-treeインデクスが使用されるように,可能ならば探索条件を変更してください。絞り込みが効くB-treeインデクスを使用した方が性能向上が見込めます。

(2) 例2(単一列インデクス同士の優先順位)

B-treeインデクス(単一列インデクス)同士の優先順位の例を説明します。

B-treeインデクスの定義例:

 CREATE INDEX "IDX_C1"
       ON "T1" ("C1")
     IN "DBAREA01"
     EMPTY
 
 CREATE INDEX "IDX_C2"
       ON "T1" ("C2")
     IN "DBAREA01"
     EMPTY

実行するSELECT文の例:

 SELECT * FROM "T1"
     WHERE "C2"='U0100' AND "C1"=100

この場合,B-treeインデクスIDX_C1と,B-treeインデクスIDX_C2の優先順位はどちらも2になります。この場合,探索条件で先に書いた列のB-treeインデクスが優先されるため,B-treeインデクスIDX_C2が検索時に使用されます。

(3) 例3(複数列インデクス同士の優先順位)

B-treeインデクス(複数列インデクス)同士の優先順位の例を説明します。

B-treeインデクスの定義例:

 CREATE INDEX "IDX_C1C2"
       ON "T1" ("C1","C2")
     IN "DBAREA01"
     EMPTY
 
 CREATE INDEX "IDX_C2C3"
       ON "T1" ("C2","C3")
     IN "DBAREA01"
     EMPTY

実行するSELECT文の例:

 SELECT "C1","C2","C3" FROM "T1"
     WHERE "C2"='U0100'

この場合,B-treeインデクスIDX_C2C3が使用されます。

IDX_C1C2C2列がインデクス第2構成列のため,C2列がインデクス第1構成列のIDX_C2C3が使用されます。

(4) 例4(単一列インデクスと複数列インデクスの優先順位)

B-treeインデクスの単一列インデクスと複数列インデクスの優先順位の例を説明します。

B-treeインデクスの定義例:

 CREATE INDEX "IDX_C1"
       ON "T1" ("C1")
     IN "DBAREA01"
     EMPTY
 
 CREATE INDEX "IDX_C3C2"
       ON "T1" ("C3","C2")
     IN "DBAREA01"
     EMPTY

実行するSELECT文の例:

 SELECT "C1","C2","C3" FROM "T1"
     WHERE "C1">100 AND "C2"='U0100'

この場合,B-treeインデクスIDX_C1が使用されます。

IDX_C3C2C2列がインデクス第2構成列のため,C1列をインデクス構成列とするIDX_C1が使用されます。

(5) 例5(単一列インデクスと複数列インデクスの優先順位)

B-treeインデクスの単一列インデクスと複数列インデクスの優先順位の例を説明します。

B-treeインデクスの定義例:

 CREATE INDEX "IDX_C1"
       ON "T1" ("C1")
     IN "DBAREA01"
     EMPTY
 
 CREATE INDEX "IDX_C2C3"
       ON "T1" ("C2","C3")
     IN "DBAREA01"
     EMPTY

実行するSELECT文の例:

 SELECT "C1","C2","C3" FROM "T1"
     WHERE "C1">100 AND "C2"='U0100'

この場合,B-treeインデクスIDX_C1の優先順位は15になり,B-treeインデクスIDX_C2C3の優先順位は2になります。したがって,B-treeインデクスIDX_C2C3が使用されます。

C1列をインデクス構成列とするIDX_C1と,C2列をインデクス第1構成列とするIDX_C2C3は,「表5‒1 表に複数のインデクスが定義されている場合のインデクスの優先順位」に示す優先順位の比較対象になります。

(6) 例6(テキストインデクスとB-treeインデクスの優先順位)

テキストインデクスとB-treeインデクス(単一列インデクス)の優先順位の例を説明します。

インデクスの定義例:

 CREATE INDEX "IDX_TXT_C1"      ←テキストインデクスの定義
       ON "T1" ("C1")
     IN "DBAREA01"
     EMPTY
     INDEXTYPE TEXT

 CREATE INDEX "IDX_C2"          ←B-treeインデクスの定義
       ON "T1" ("C2")
     IN "DBAREA01"
     EMPTY

実行するSELECT文の例:

 SELECT "C1","C2","C3" FROM "T1"
     WHERE "C1" LIKE '%XYZ%' AND "C2" LIKE 'ABC%'

この場合,テキストインデクスIDX_TXT_C1の優先順位は8になり,B-treeインデクスIDX_C2の優先順位は4になります。したがって,B-treeインデクスIDX_C2が検索時に使用されます。

重要

上記のケースで,優先順位に従ってどちらかのインデクスだけが使用される場合,絞り込みがより効くインデクスが使用されるように,可能ならば探索条件を変更してください。絞り込みが効くインデクスを使用した方が性能向上が見込めます。

(7) 検索時に使用されるインデクスを変更したい場合

検索時に使用されるインデクスを変更する方法について説明します。

(a) 優先順位が同じ場合は,使用したいインデクス構成列を先に書く

(2) 例2(単一列インデクス同士の優先順位)」で説明したとおり,優先順位が同じ場合,探索条件で先に書いた列のB-treeインデクスが優先されます。これを利用して,使用するB-treeインデクスを変更できます。例えば,次のように探索条件の指定を変更したとします。

<変更前>
SELECT * FROM "T1"
    WHERE "C3"='A001' AND "C2"='U0100'
<変更後>
SELECT * FROM "T1"
    WHERE "C2"='U0100' AND "C3"='A001'

変更前はC3列に定義したB-treeインデクスIDX_C3が使用されていましたが,変更後はC2列に定義したB-treeインデクスIDX_C2が使用されます。

(b) 現在使用されているインデクスの優先順位を下げる

現在使用されているインデクスの優先順位を下げて,もう一方のインデクスを使用するようにします。例えば,次のように探索条件の指定を変更したとします。

<変更前>
SELECT * FROM "T1"
    WHERE "C1"=100 AND "C2" LIKE 'ABC%'
<変更後>
SELECT * FROM "T1"
    WHERE "C1" BETWEEN 100 AND 100 AND "C2" LIKE 'ABC%'

変更前はIDX_C1の優先順位は2,IDX_C2の優先順位は4でしたが,変更後はIDX_C1の優先順位が13になります。そのため,変更前はB-treeインデクスIDX_C1が使用されていましたが,変更後はB-treeインデクスIDX_C2が使用されます。

(c) インデクス指定を使用する

検索時に使用するインデクスをインデクス指定で指定できます。例を次に示します。

<変更前>
SELECT * FROM "T1"
    WHERE "C1"=100 AND "C2" LIKE 'ABC%'

C1列に定義したB-treeインデクスIDX_C1の優先順位は2,C2列に定義したB-treeインデクスIDX_C2の優先順位は4のため,IDX_C1が使用されます。

<変更後>
SELECT * FROM "T1" /*>> WITH INDEX (IDX_C2) <<*/
    WHERE "C1"=100 AND "C2" LIKE 'ABC%'

下線部分のインデクス指定で,検索時に使用するインデクスを指定できます。上記のSELECT文を実行した場合,IDX_C2が使用されます。

インデクス指定の詳細については,マニュアルHADB SQLリファレンスインデクス指定を参照してください。