9.2.11 SQLの最適化に関するオペランド
- ◆ pd_optimize_level = SQL最適化オプション〔,SQL最適化オプション〕…
-
〜<識別子又は符号なし整数>
SQL最適化オプションを指定します。
SQL最適化オプションの指定値及びその内容については,マニュアル「HiRDB UAP開発ガイド」の「PDSQLOPTLVL」を参照してください。
- 《オペランドの省略値》
-
このオペランドを省略すると次に示す値が仮定されます。
-
HiRDB/シングルサーバの場合
"PRIOR_NEST_JOIN","PRIOR_OR_INDEXES","DETER_AND_INDEXES","RAPID_GROUPING",
"DETER_WORK_TABLE_FOR_UPDATE","APPLY_ENHANCED_KEY_COND" ,"MOVE_UP_DERIVED_COND"
-
HiRDB/パラレルサーバの場合
"PRIOR_NEST_JOIN","PRIOR_OR_INDEXES","SORT_DATA_BES","DETER_AND_INDEXES",
"RAPID_GROUPING","DETER_WORK_TABLE_FOR_UPDATE","APPLY_ENHANCED_KEY_COND" ,"MOVE_UP_DERIVED_COND","FLTS_ONLY_DATA_BES"
0904互換モードの場合は,次に示す値が仮定されます。
-
HiRDB/シングルサーバの場合
"PRIOR_NEST_JOIN","PRIOR_OR_INDEXES","DETER_AND_INDEXES","RAPID_GROUPING",
"DETER_WORK_TABLE_FOR_UPDATE","APPLY_ENHANCED_KEY_COND"
-
HiRDB/パラレルサーバの場合
"PRIOR_NEST_JOIN","PRIOR_OR_INDEXES","SORT_DATA_BES","DETER_AND_INDEXES",
"RAPID_GROUPING","DETER_WORK_TABLE_FOR_UPDATE","APPLY_ENHANCED_KEY_COND"
-
- 《オペランドの指定方法》
-
適用するSQL最適化オプションを選択して,その識別子又は符号なし整数を指定します。識別子で指定する方法と,符号なし整数(計算値)で指定する方法の二つの方法がありますが,通常は識別子で指定してください。
-
識別子で指定する場合
「ネストループジョイン強制」及び「複数のSQLオブジェクト作成」を適用する場合は,次のように指定します。
pd_optimize_level = "FORCE_NEST_JOIN","SELECT_APSL"
-
符号なし整数で指定する場合
「ネストループジョイン強制」及び「複数のSQLオブジェクト作成」を適用する場合は,次のように指定します。
pd_optimize_level = 4,10
●HiRDB Version 5.0以前からバージョンアップした場合
HiRDB Version 5.0以前の合計値指定も有効です。最適化オプションを変更する必要がない場合は,HiRDB Version 6以降にバージョンアップしたときにこのオペランドの指定値を変更する必要はありません。また,最適化オプションを追加する場合は次のように指定できます。
(例)
HiRDB Version 5.0で「ネストループジョイン強制」及び「複数のSQLオブジェクト作成」を適用していて,今回「ORの複数インデクス利用の優先」を追加します。
pd_optimize_level = 14,128
ただし,この指定方法はどの機能を適用しているか分かりにくいため,識別子指定に変更することをお勧めします。
-
- 《オペランドの規則》
-
-
識別子と符号なし整数の混在指定はできません。
●識別子指定の場合
-
SQL最適化オプションを引用符(")で囲んでください。
-
ここで説明したSQL最適化オプションを使用しない場合は"NONE"を指定してください。ただし,NONEとNONE以外の識別子を指定した場合,NONEの指定は無効になります。
-
識別子は大文字でも小文字でも指定できます。
-
同じ識別子を2回以上指定しても,1回指定した場合と同じになります。
●符号なし整数指定の場合
-
ここで説明したSQL最適化オプションを使用しない場合は0を指定してください。ただし,0と0以外の符号なし整数を指定した場合,0の指定は無効になります。
-
同じ符号なし整数を2回以上指定しても,1回指定した場合と同じになります。
-
- 《指定値の目安》
-
指定値の目安については,マニュアル「HiRDB UAP開発ガイド」の「PDSQLOPTLVL」を参照してください。
- 《注意事項》
-
-
SQL文中にSQL最適化指定を指定している場合は,このオペランドの指定よりもSQL最適化指定が優先されます。SQL最適化指定については,マニュアル「HiRDB SQLリファレンス」を参照してください。
-
ストアドルーチン及びトリガ中のSQL文(CREATE PROCEDURE,CREATE TYPE,ALTER PROCEDURE,CREATE TRIGGER,ALTER ROUTINE,又はALTER TRIGGER)にSQL最適化オプションを指定している場合は,このオペランドの指定よりもSQL文中のSQL最適化オプションが優先されます。
-
- 《クライアント環境定義との関連》
-
-
このオペランドの値はクライアントごとに変更できます。クライアントごとに変更する場合は,クライアント環境定義のPDSQLOPTLVLオペランドを指定してください。PDSQLOPTLVLオペランドについては,マニュアル「HiRDB UAP開発ガイド」を参照してください。
-
- 《ほかのオペランドとの関連》
-
-
フロントエンドサーバ定義にpd_floatable_bes,又はpd_non_floatable_besオペランドを指定している場合には,「フロータブルサーバ対象拡大(データ取り出しバックエンドサーバ)」及び「フロータブルサーバ対象限定(データ取り出しバックエンドサーバ)」の指定は無効になります。
-
pd_indexlock_modeオペランドにKEYを指定している場合,「更新SQLの作業表作成抑止」の指定は無効になります。
-
- ◆ pd_additional_optimize_level = SQL拡張最適化オプション〔,SQL拡張最適化オプション〕…
-
〜<識別子又は符号なし整数>
SQL拡張最適化オプションを指定します。
SQL拡張最適化オプションの指定値及びその内容については,マニュアル「HiRDB UAP開発ガイド」の「PDADDITIONALOPTLVL」を参照してください。
- 《オペランドの省略値》
-
このオペランドを省略すると次に示す値が仮定されます。
"COST_BASE_2","APPLY_JOIN_COND_FOR_VALUE_EXP","APPLY_SRCH_COND_FOR_VALUE_EXP","MERGE_FROM_DERIVED_TABLE","CONVERT_OUTER_INNER_JOIN"
0904互換モードの場合は,次に示す値が仮定されます。
"COST_BASE_2"
- 《オペランドの指定方法》
-
適用するSQL拡張最適化オプションを選択して,その識別子又は符号なし整数を指定します。通常は識別子で指定してください。
-
識別子で指定する場合
「コストベース最適化モード2の適用」及び「ハッシュジョイン,副問合せのハッシュ実行」を適用する場合は,次のように指定します。
pd_additional_optimize_level = "COST_BASE_2","APPLY_HASH_JOIN"
-
符号なし整数で指定する場合
「コストベース最適化モード2の適用」及び「ハッシュジョイン,副問合せのハッシュ実行」を適用する場合は,次のように指定します。
pd_additional_optimize_level = 1,2
-
- 《オペランドの規則》
-
-
識別子と符号なし整数の混在指定はできません。
●識別子指定の場合
-
SQL拡張最適化オプションを引用符(")で囲んでください。
-
ここで説明したSQL拡張最適化オプションを使用しない場合は"NONE"を指定してください。ただし,NONEとNONE以外の識別子を指定した場合,NONEの指定は無効になります。
-
識別子は大文字でも小文字でも指定できます。
-
同じ識別子を2回以上指定しても,1回指定した場合と同じになります。
●符号なし整数指定の場合
-
ここで説明したSQL拡張最適化オプションを使用しない場合は0を指定してください。ただし,0と0以外の符号なし整数を指定した場合,0の指定は無効になります。
-
同じ符号なし整数を2回以上指定しても,1回指定した場合と同じになります。
-
- 《指定値の目安》
-
指定値の目安については,マニュアル「HiRDB UAP開発ガイド」の「PDADDITIONALOPTLVL」を参照してください。
- 《注意事項》
-
-
SQL文中にSQL最適化指定を指定している場合は,このオペランドの指定よりもSQL最適化指定が優先されます。SQL最適化指定については,マニュアル「HiRDB SQLリファレンス」を参照してください。
-
ストアドルーチン及びトリガ中のSQL文(CREATE PROCEDURE,CREATE TYPE,CREATE TRIGGER,ALTER PROCEDURE,ALTER ROUTINE,又はALTER TRIGGER)にSQL拡張最適化オプションを指定している場合は,このオペランドの指定よりもSQL文中のSQL拡張最適化オプションが優先されます。
-
- 《クライアント環境定義との関連》
-
このオペランドの値はクライアントごとに変更できます。クライアントごとに変更する場合は,クライアント環境定義のPDADDITIONALOPTLVLオペランドを指定してください。PDADDITIONALOPTLVLオペランドについては,マニュアル「HiRDB UAP開発ガイド」を参照してください。
- ◆ pd_hash_table_size = ハッシュ表サイズ
-
〜<符号なし整数>《256》(単位:キロバイト)
-
32ビットモードの場合:((128〜524288))
-
64ビットモードの場合:((128〜2097152))
SQL拡張最適化オプションで「ハッシュジョイン,副問合せのハッシュ実行」を指定した場合のハッシュ表サイズを指定します。
- 《指定値の目安》
-
このオペランドに指定するハッシュ表サイズについては,マニュアル「HiRDB UAP開発ガイド」を参照してください。
- 《オペランドの規則》
-
このオペランドには128の倍数を指定してください。128の倍数を指定しなかった場合は自動的に128の倍数に切り上げられます。
- 《クライアント環境定義との関連》
-
このオペランドの値はクライアントごとに変更できます。クライアントごとに変更する場合は,クライアント環境定義のPDHASHTBLSIZEオペランドを指定してください。PDHASHTBLSIZEオペランドについては,マニュアル「HiRDB UAP開発ガイド」を参照してください。
- 《各見積もり式への影響》
-
pd_hash_table_sizeオペランドの指定値を変更すると,次の見積もり式に影響があります。
マニュアル「HiRDB システム導入・設計ガイド」:
-
「HiRDB/シングルサーバのメモリ所要量の見積もり」の「ハッシュジョイン及び副問合せのハッシュ実行時に必要なメモリ所要量の求め方」
-
「HiRDB/パラレルサーバのメモリ所要量の見積もり」の「ハッシュジョイン及び副問合せのハッシュ実行時に必要なメモリ所要量の求め方」
-
-
- ◆ pd_work_table_option = 作業表処理オプション
-
〜<符号なし整数>《1》
作業表を使用するSQLを実行するときのHiRDBの処理方式を指定します。このオペランドの指定値は次に示す計算式で求めてください。
作業表処理オプション=a+b
作業表の
処理区分
変数名
値
HiRDBの処理方式
ANDの複数インデクス利用時の排他取得方式※1
a
0
アクセスパスとしてANDの複数インデクス利用が選択されると,探索条件中で探索に使用するインデクスが定義された列を含む述語のうち一つでも真となるデータがある場合,そのデータに対して共用モード(PR)で排他が掛かります。
このため,排他オプション※2にWITH EXCLUSIVE LOCKを指定しても,排他モード(EX)ではなく,共用モード(PR)で排他が掛かります。
1
アクセスパスとしてANDの複数インデクス利用が選択されると,探索処理中には,探索条件の中で探索に使用するインデクスが定義された列を含む述語のうち一つでも真となるデータがある場合,そのデータに対して指定したモードで排他が掛かります。ただし,1件目のデータの探索完了までは,探索に使用したインデクスが定義された列に対する述語を論理演算し,偽となったデータについては排他が解除されます。
作業表用バッファの自動増分時のメッセージ出力抑止※3
b
0
作業表用バッファの自動増分時,KFPH29008-Iメッセージを出力します。このメッセージは各サーバプロセスの初回の作業表用バッファの自動増分時に出力されます。
8
作業表用バッファの自動増分時,KFPH29008-Iメッセージを出力しません。
- 注※1
-
ANDの複数インデクス利用をするときのHiRDBの処理方式を指定します。
ANDの複数インデクス利用とは,探索条件にANDで結ばれた条件が複数あり,それぞれの列に異なるインデクスが定義してある場合(例えば,SELECT ROW FROM T1 WHERE C1 = 100 AND C2 = 200),それぞれのインデクスを使って条件を満たす行の作業表を作成し,これらの積集合を求める方式です。
- 注※2
-
SQLに排他オプションを指定していない場合は,通常WITH SHARE LOCKが仮定されます。ただし,次に示す指定によっては仮定される排他オプションが変わるため,注意してください。
-
カーソルへのFOR UPDATE句の指定
-
システム定義のpd_isolation_levelオペランドの指定
-
クライアント環境定義のPDISLLVLオペランドの指定
-
手続き,関数,又はトリガのCREATE PROCEDURE,CREATE TRIGGER,CREATE TYPE,ALTER PROCEDURE,ALTER ROUTINE,又はALTER TRIGGERのデータ保証レベルの指定
-
- 注※3
-
pd_work_buff_expand_limitオペランドを指定していることが前提条件となります。作業表用バッファの自動増分については,pd_work_buff_expand_limitオペランドを参照してください。
- 《指定値の目安》
-
作業表の
処理区分
値
指定値の目安
ANDの複数インデクス利用時の排他取得方式
0
0を指定すると排他を解除する処理が実行されない分,SQLの処理時間が短縮されます。ただし,複数のユーザが同時に同一表を,ANDの複数インデクス利用で更新をするとデッドロックになることがあります。デッドロックを避けるには1を指定してください。
1
1を指定すると排他を解除する処理が実行される分,SQLの処理時間が増加します。しかし,最終的な排他範囲は狭くなるので,更新UAPの同時実行性が向上します。
作業表用バッファの増分確保メッセージの出力抑止
0
0を指定すると,作業表用バッファの増分確保がされたかどうかを監視できます。
8
8を指定すると,メッセージの出力量を削減できます。
- 《注意事項》
-
作業表の処理区分にANDの複数インデクス利用時の排他取得方式を選択したときの注意事項を次に示します。
-
手続き,関数,及びトリガに対しては,ストアドルーチン及びトリガ生成時(CREATE PROCEDURE,CREATE TRIGGER,CREATE TYPE,ALTER PROCEDURE,ALTER ROUTINE,又はALTER TRIGGERの実行時)のANDの複数インデクス利用時の排他取得方式が適用されます。ストアドルーチン実行時(CALL文の実行時)及びトリガ実行時のANDの複数インデクス利用時の排他取得方式は適用されません。
-
次に示すオペランド又はオプションでANDの複数インデクス利用が抑止される場合,このオペランドの指定は無効になります。
・pd_optimize_levelオペランド
・クライアント環境定義のPDSQLOPTLVLオペランド
・CREATE PROCEDURE,CREATE TRIGGER,CREATE TYPE,ALTER PROCEDURE,ALTER ROUTINE,又はALTER TRIGGERのSQL最適化オプション
-
- ◆ pd_floatable_bes = "バックエンドサーバ名"〔,"バックエンドサーバ名"〕…
-
〜<識別子>((1〜8文字))
フロータブルサーバとして使用するバックエンドサーバを指定します。
ただし,指定したバックエンドサーバをすべてフロータブルサーバとして使用するとは限りません。
通常はデータ取り出しに使用するサーバは,フロータブルサーバとして使用しませんが,このオペランドを指定した場合はデータ取り出しに使用するサーバもフロータブルサーバの候補とします。
- 《オペランドの規則》
-
-
定義されていないバックエンドサーバ名を指定した場合は無視します。
-
すべてが定義されていないバックエンドサーバ名の場合は,このオペランドを無視します。
-
- 《ほかのオペランドとの関連》
-
-
pd_non_floatable_besオペランドを同時に指定している場合,pd_non_floatable_besオペランドを無効とします。
-
pd_floatable_besオペランドを指定すると,pd_optimize_levelオペランドの「フロータブルサーバ対象拡大(データ取り出しバックエンドサーバ)」は適用されません。
-
pd_floatable_besオペランドを指定すると,pd_optimize_levelオペランドの「フロータブルサーバ対象限定(データ取り出しバックエンドサーバ)」は適用されません。
-
- ◆ pd_non_floatable_bes = "バックエンドサーバ名"〔,"バックエンドサーバ名"〕…
-
〜<識別子>((1〜8文字))
フロータブルサーバとして使用しないバックエンドサーバを指定します。
すべてのバックエンドサーバを指定している場合は,このオペランドを無効とします。
- 《オペランドの規則》
-
定義されていないバックエンドサーバ名を指定した場合は無視します。
- 《ほかのオペランドとの関連》
-
-
pd_floatable_besオペランドを同時に指定している場合,このオペランドを無効とします。
-
pd_non_floatable_besオペランドを指定すると,pd_optimize_levelオペランドの「フロータブルサーバ対象拡大(データ取り出しバックエンドサーバ)」は適用されません。
-
pd_non_floatable_besオペランドを指定すると,pd_optimize_levelオペランドの「フロータブルサーバ対象限定(データ取り出しバックエンドサーバ)」は適用されません。
-