スケーラブルデータベースサーバ HiRDB Version 8 コマンドリファレンス(UNIX(R)用)

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

17.6.3 インデクス検索について

<この項の構成>
(1) 探索条件にORを指定した検索(その1)
(2) 探索条件にORを指定した検索(その2)
(3) 結合条件にORを指定した結合検索
(4) 範囲述語の検索
(5) GROUP BY指定した検索
(6) GROUP BY,ORDER BYの両方を指定した検索

(1) 探索条件にORを指定した検索(その1)

(a) 表示の確認

1表検索の場合に,TABLE SCANとなって性能が悪くないか確認してください。

(b) ベターユース

ORの両辺に同じ条件を指定している場合には,同じ条件をORの外へ抜き出してください。

(c) 理由
(d) 

ORは更にIN述語に変換した方がよい場合があります。詳細については,「(2) 探索条件にORを指定した検索(その2)」を参照してください。

(2) 探索条件にORを指定した検索(その2)

(a) 表示の確認

探索条件に対して同一列に対する条件をORで指定している場合に,サーチ条件がない,又はサーチ条件が有効でなくインデクスのサーチ範囲が絞れずに性能が悪くないか確認してください。

(b) ベターユース

HiRDBのバージョン06-02以降の場合,HiRDBのバージョンが06-01よりも前で単一列インデクスが定義されている場合,及びHiRDBのバージョンが06-01よりも前で複数列インデクスが定義されている場合とでベターユースが異なります。

(c) 理由
(d) 
(e) 注意事項

HiRDBのバージョンが06-01よりも前の複数列インデクスの場合でも,次の二つの条件を共に満たすときには,IN述語を使用してください。

(3) 結合条件にORを指定した結合検索

(a) 表示の確認

Join TypeがCROSS JOINとなっている場合,内部的に直積処理をしています。結合条件にOR演算子を指定している場合,ORの両辺を別々に指定した集合演算(UNION,又はUNION ALL)を用いた等価なSQLにすると,効率的に検索できる可能性があります。

(b) ベターユース

結合条件がORで結ばれている場合は,ORの両辺を別々に指定した集合演算を使用します。

(c) 理由

結合条件をOR演算子で結んでいる場合,結合する表の直積をしてから,直積結果に対して結合条件を評価します。

OR演算子を分離すると,ネストループジョイン,又はマージジョインをするので,結合時のデータの突き合わせ回数を削減できます。

さらに,ネストループジョインをすると,結合にインデクスを使用できるので,入出力回数を削減できます。

(d) 
(e) 注意事項
  1. UNIONを指定すると,内部的に各問合せ指定の結果の作業表を作成します。この場合,重複排除のためにソート処理をします。
    また,UNION ALLを指定した場合も,内部的に各問合せ指定の結果の作業表を作成します。ただし,この場合はソート処理をしません。
  2. 結合列にインデクスが定義されていても,外側表が制限条件で絞り込まれていなければ,結合にインデクスを使用しません。結合列にインデクスが定義されている表が内側表になり,もう一方の表が外側表になります。
  3. 「(d) 例」のDISTINCT指定なしの場合の例は,T1.C1,T2.C1がNOT NULL 列,又はNULL値を挿入しない運用であれば,IS NULL述語は必要ありません。また,選択式にDISTINCTを指定しても意図した結果を得られる場合は,集合演算をUNION ALLではなくUNIONにするようにしてください。

(4) 範囲述語の検索

(a) ベターユース

AND演算で同じ列の>=述語と<=述語を結んでいる場合,SQL最適化処理をする前にBETWEEN述語に変換します。この場合,WHERE句の先に指定した述語から順に,BETWEEN述語に変換していきます。

AND演算で同じ列の>=述語と<=述語を結んだ条件とBETWEEN述語は,HiRDBの内部では等価に扱われるため,どちらで指定しても同じになります。

>=述語と<=述語が範囲を形成しているかどうか確認してください。

(b) 
(c) 注意事項

冗長な述語がある場合,データベースアクセス時に不要な条件判定がされます。冗長な条件はできるだけ削除するようにしてください。

(5) GROUP BY指定した検索

(a) ベターユース

HiRDB/パラレルサーバで複数の列に対するGROUP BY検索をする場合は,重複の少ないGROUP化列をGROUP BY句の先に指定してください。ただし,SQL最適化オプションに1024を指定していない場合だけです。

(b) 理由

HiRDB/パラレルサーバで複数のフロータブルサーバを使用してGROUP BY処理をする場合に,フロータブルサーバへデータを振り分けるためにGROUP BY句の先頭の列でハッシングしています。GROUP BY句の先頭の列に重複が少ない場合,各フロータブルサーバへ均等にハッシングできるので,並列処理の効果が上がります。

(c) 
 
SELECT C1,C2,SUM(C3) FROM T1 GROUP BY C1,C2

(C1の重複数)>(C2の重複数)の場合は次のように変更します。

         ↓
SELECT C1,C2,SUM(C3) FROM T1 GROUP BY C2,C1
 
(d) 注意事項

SQL最適化オプションに1024を指定している場合には,すべてのグループ化列を使用してハッシングするので,GROUP BYの順番を入れ替える必要はありません。ただし,「17.6.2(4) ORDER BY,GROUP BYを指定した検索に使用する表のインデクス定義」に該当する場合には,グループ化列を入れ替えないでください。

(6) GROUP BY,ORDER BYの両方を指定した検索

(a) ベターユース
(b) 理由
(c) 
(d) 注意事項

GROUP BY句に対して,「17.6.2(4) ORDER BY,GROUP BYを指定した検索に使用する表のインデクス定義」に該当するインデクスを定義できる場合,そちらを優先してください。