5.11 データベースをアクセスする処理性能の向上
5.11.5 SQL の最適化
データベースの状態を考慮して,最も効率的なアクセスパスを決定することをSQL の最適化といいます。
SQL の最適化には,SQL 最適化指定,SQL 最適化オプション,及びSQL 拡張最適化オプションがありま す。SQL 最適化指定の機能を表 5-3 に,SQL 最適化オプションの機能を表 5-4 に,SQL 拡張最適化オプ ションの機能を表 5-5 に示します。なお,SQL の最適化にはここで説明する項目以外の機能もあります。
その機能は常に性能が向上するため,オプションとしていません(必ず適用されます)。SQL 最適化指定,
SQL 最適化オプション,及び SQL 拡張最適化オプションについては,マニュアル「HiRDB Version 9 UAP 開発ガイド」を参照してください。
5 SQL によるデータベースアクセス
161
表 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 集合関数処理を,フロータブルサーバを使用しないで,
SQL 最適化 オプション
の機能
説明
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 文中 に指定するようにしてください。
スカラ演算を含む キー条件の適用
この最適化を指定すると,スカラ演算を指定した制限条件のうち,スカラ演算中に含まれる列がすべて インデクス構成列の場合に,インデクスのキー値ごとに判定して絞り込みをします。この条件はキー条 件として評価されます。
5 SQL によるデータベースアクセス
163