Hitachi

ノンストップデータベース HiRDB Version 10 解説


5.11.5 SQLの最適化

データベースの状態を考慮して,最も効率的なアクセスパスを決定することをSQLの最適化といいます。SQLの最適化には,SQL最適化指定SQL最適化オプション,及びSQL拡張最適化オプションがあります。これらについては,次の表を参照してください。

なお,SQLの最適化にはここで説明する項目以外の機能もあります。その機能は常に性能が向上するため,オプションとしていません(必ず適用されます)。SQL最適化指定,SQL最適化オプション,及びSQL拡張最適化オプションについては,マニュアル「HiRDB UAP開発ガイド」を参照してください。

表5‒3 SQL最適化指定の機能

SQL最適化指定の機能

説明

使用インデクスのSQL最適化指定

表の検索で使用するインデクスを指定できます。また,表の検索でインデクスを利用しないようにすることもできます(テーブルスキャン)。

使用インデクスのSQL最適化指定は次に示すSQLで指定できます。

  • 表式

  • DELETE文

  • UPDATE文形式1

結合方式のSQL最適化指定

結合表に対する結合方式(ネストループジョイン,ハッシュジョイン,又はマージジョイン)を指定できます。

結合方式のSQL最適化指定は次に示すSQLで指定できます。

  • 表式

副問合せ実行方式のSQL最適化指定

述語中の副問合せに対する副問合せの実行方式をハッシュ実行にするか,又はハッシュ実行以外にするかを指定できます。

副問合せ実行方式のSQL最適化指定は次に示すSQLで指定できます。

  • 副問合せ

表5‒4 SQL最適化オプションの機能

SQL最適化

オプション

の機能

説明

ネストループジョイン強制

結合条件の列にインデクスを定義してある場合,結合処理にネストループジョインだけを使用します。

複数のSQLオブジェクト作成

あらかじめ複数のSQLオブジェクトを作成し,実行時に埋込み変数,又は?パラメタの値によって,最適なSQLオブジェクトを選択します。

フロータブルサーバ対象拡大(データ取り出しバックエンドサーバ)

通常はデータ取り出しに使用しないバックエンドサーバをフロータブルサーバとして使用しています。この最適化方法を適用すると,データ取り出しに使用するバックエンドサーバについてもフロータブルサーバとして使用します。ただし,フロータブルサーバとして使用するバックエンドサーバ数はHiRDBが計算して求めるため,すべてのバックエンドサーバを使用するとは限りません。すべてのバックエンドサーバを使用したい場合は,「フロータブルサーバ候補数の拡大」とともに指定してください。

ネストループジョイン優先

結合条件の列にインデクスを定義してある場合,結合処理にネストループジョインを優先して使用します。

フロータブルサーバ候補数の拡大

通常使用するフロータブルサーバ数は,利用できるフロータブルサーバから必要数をHiRDBが計算して割り当てます。この最適化方法を適用すると,利用できるフロータブルサーバをすべて利用します。ただし,データ取り出しに使用するバックエンドサーバはフロータブルサーバとして使用できません。データ取り出しに使用するバックエンドサーバもフロータブルサーバとして使用したいときは,「フロータブルサーバ対象拡大(データ取り出しバックエンドサーバ)」とともに指定してください。

ORの複数インデクス利用の優先

ORの複数インデクスを利用して検索する方法を,優先して適用したい場合に指定します。ORの複数インデクス利用とは,探索条件中のORで結ばれた複数の条件に対して,インデクスを使用してそれぞれの条件を検索し,検索結果の和集合で探索条件を評価する方式をいいます。

自バックエンドサーバでのグループ化,ORDER BY,DISTINCT集合関数処理

グループ化,ORDER BY,及びDISTINCT集合関数処理を,フロータブルサーバを使用しないで,表が定義されているバックエンドサーバ(自バックエンドサーバ)で処理します。

ANDの複数インデクス利用の抑止

ANDの複数インデクス利用をするアクセスパスを常に使わないようにします。

ANDの複数インデクス利用とは,探索条件にANDで結ばれた条件が複数あり,それぞれの列に異なるインデクスが定義してある場合(例えば,SELECT ROW FROM T1 WHERE C1 = 100 AND C2 = 200),それぞれのインデクスを使って条件を満たす行の作業表を作成し,これらの積集合を求める方式です。

グループ分け高速化処理

SQLのGROUP BY句で指定したグループ分けを,ハッシングを使って高速に処理します。

フロータブルサーバ対象限定(データ取り出しバックエンドサーバ)

通常はデータ取り出しに使用しないバックエンドサーバをフロータブルサーバとして使用しています。この最適化方法を適用すると,データ取り出しに使用するバックエンドサーバだけをフロータブルサーバとして使用します。

データ収集用サーバの分離機能

「フロータブルサーバ対象拡大(データ取り出しバックエンドサーバ)」,及び「フロータブルサーバ対象限定(データ取り出しバックエンドサーバ)」を指定した場合は,データ収集用サーバの分離機能となります。データ収集用サーバの分離機能を適用した場合,複数のバックエンドサーバから1か所のバックエンドサーバにデータを集める必要があるSQLに対しては,データ転送元以外のバックエンドサーバをデータ収集用に割り当てます。これ以外の用途のフロータブルサーバとしては,データ収集用以外のバックエンドサーバ(データ取り出しバックエンドサーバも含みます)を割り当てます。

インデクス利用の抑止(テーブルスキャン強制)

通常はインデクスの利用判定をHiRDBが決定します。この最適化方法を適用すると,インデクスを使用しない方式を強制的に使用するようにします。ただし,ジョインを使用してネストループ結合になる場合,構造化繰返し述語を探索条件に指定した場合,又はインデクス型プラグイン専用関数の条件の場合は,インデクス利用を抑止できません。

複数インデクス利用の強制

ANDの複数インデクス利用を強制的に選択して,表を検索する場合に指定します。ANDで結ばれた条件を複数指定している場合,この最適化を指定しないとANDの複数インデクス利用が選択されたときでも,通常は最大二つ程度のインデクスしか使用しません。使用するインデクスの数は,表定義,インデクス定義,及び探索条件によって多少変わります。この最適化を指定すると,インデクスによって検索範囲が絞り込める条件をすべて使用するようになります。ANDの複数インデクス利用は,それぞれのインデクスを使用してある程度の件数に絞り込めます。さらに,積集合によって重なっている部分が少ない場合に有効となります。

更新SQLの作業表作成抑止

インデクスキー値無排他を適用している場合にこの最適化を指定すると,FOR UPDATE句を指定した検索,UPDATE文,又はDELETE文に対してインデクスを使用したときでも,HiRDBは内部処理のための作業表を作成しません。したがって,高速にSQL文を処理できます。なお,インデクスキー値無排他を適用していない場合,作業表は作成されます。インデクスを使用しているかどうかについては,アクセスパス表示ユティリティで確認できます。

探索高速化条件の導出

この最適化を指定すると,探索高速化条件の導出をします。探索高速化条件とは,WHERE句の探索条件,FROM句のON 探索条件から,CNF変換,又は条件推移で新たに導出される条件のことをいいます。探索高速化条件を導出すると,検索する行が早い段階で絞り込まれるため,検索性能が向上します。ただし,探索高速化条件の生成及び実行に時間が掛かるか,又はアクセスパスが意図したとおりにならない場合があるため,できるだけこの最適化は指定しないで,探索高速化条件を直接SQL文中に指定するようにしてください。

スカラ演算を含むキー条件の適用

この最適化を指定すると,スカラ演算を指定した制限条件のうち,スカラ演算中に含まれる列がすべてインデクス構成列の場合に,インデクスのキー値ごとに判定して絞り込みをします。この条件はキー条件として評価されます。

プラグイン提供関数からの一括取得機能

探索条件にプラグイン提供関数を指定し,HiRDBがプラグインインデクスを使用して検索する場合,通常,HiRDBはプラグイン提供関数からの返却結果(行位置情報と,必要に応じて受渡し値)を1行ごとに取得します。この最適化を適用すると,プラグイン提供関数の返却結果を複数行まとめて取得できるため,プラグイン提供関数の呼び出し回数を削減できます。

導出表の条件繰り込み機能

通常,導出表のための作業表には,導出表の列に対する探索条件に一致しない行も格納します。この最適化方法を適用すると,導出表の列に対する探索条件に一致しない行を除いた後に,導出表のための作業表を作成します。これによって,作業表の容量,及び作業表への入出力回数を削減できます。また,このようなアクセスパスを使用することによって,検索する行をより有効に絞り込めるインデクスを利用できる場合があります。なお,バージョン08-02以降のHiRDBを初めて導入する場合は,この機能の使用をお勧めします。

表5‒5 SQL拡張最適化オプションの機能

SQL拡張最適化オプションの機能

説明

コストベース最適化モード2の適用

コストベース最適化モード2を使用して最適化処理をします。

ハッシュジョイン,副問合せのハッシュ実行

結合検索の場合にハッシュジョインを適用して最適化をします。副問合せを伴った検索については,ハッシングによって副問合せを処理します。ハッシュジョイン,副問合せのハッシュ実行を適用するかどうかは,結合方式及び外への参照を考慮して決めてください。

値式に対する結合条件適用機能

値式を含む条件に対して結合条件を作成します。

スカラ演算を含む条件に対するサーチ条件適用

探索前に評価できるスカラ演算を,列に対する条件値に含まれる探索条件に対して,インデクスを使用して検索することで,実行性能が向上します。

パラメタを含むXMLEXISTS述語への部分構造インデクスの有効化

次の二つの条件を満たしている場合に,部分構造インデクスを使用できるようにします。

  • XMLEXISTS述語のXML問合せ変数にCAST指定を指定し,かつCAST指定の値式に?パラメタ,SQLパラメタ,又はSQL変数を指定している。

  • 定義されているインデクスの部分構造指定と,XMLEXISTS述語のXQuery問合せ中で条件として指定した部分構造パスが一致している。

FROM句の導出表のマージ適用

FROM句に行の選択及び列の射影だけをするような単純な導出表を指定したSQLが,作業表を作成しないで実行できるようになります。これによって,FROM句に導出表を指定したSQLの実行性能が向上します。

作業表を作成しない条件については,マニュアル「HiRDB SQLリファレンス」の「表参照」の「FROM句の導出表についての規則」を参照してください。

外結合内結合変換機能

内結合を指定しても等価な結果が得られることが明らかな問合せに対して外結合を指定している場合に,外結合を内結合に変換します。

不要な処理を省略できるだけでなく,WHERE句に指定した内表の列に対する探索条件へインデクスを適用できるようになり,実行性能の向上が期待できます。

SQL最適化オプション,SQL拡張最適化オプションの設定

SQL最適化オプション及びSQL拡張最適化オプションを設定するためには,次のどれかで指定します。

  1. システム共通定義又はフロントエンドサーバ定義のpd_optimize_levelオペランド,pd_additional_optimize_levelオペランド

  2. クライアント環境定義のPDSQLOPTLVLオペランド,PDADDITIONALOPTLVLオペランド

  3. ストアドルーチン中及びトリガ中のSQL文のSQL最適化オプション,SQL拡張最適化オプション

同時に指定した場合の優先順位は,3,2,1の順となります。また,SQL最適化指定を同時に指定した場合は,SQL最適化オプション,SQL拡張最適化オプションよりもSQL最適化指定が優先されます。