SQL 解説書
SET CURRENT QUERY OPTIMIZATION ステートメントは、
CURRENT QUERY OPTIMIZATION 特殊レジスターに値を割り当てます。
この値は、動的 SQL ステートメントの準備の時点で使用される最適化手法の現行クラスを指定します。
このステートメントは、トランザクションの制御下にはありません。
呼び出し
このステートメントは、アプリケーション・プログラムに組み込むか、
または動的 SQL ステートメントを使用して発行することができます。
このステートメントは、動的に準備可能な実行可能ステートメントです。
許可
このステートメントの実行には、特に権限は必要ありません。
構文
.-=-.
>>-SET--CURRENT--QUERY--OPTIMIZATION--+---+--------------------->
>-----+-0-------------+----------------------------------------><
+-1-------------+
+-2-------------+
+-3-------------+
+-5-------------+
+-7-------------+
+-9-------------+
'-host-variable-'
説明
- optimization-class
- optimization-class (最適化クラス) は、整数定数、
または実行時に適切な値が入れられるホスト変数の名前として指定することができます。
クラスの概要を以下に示します (詳細については、管理の手引き を参照してください)。
- 0
- アクセス・プランの生成に、最低限の最適化が行われることを指定します。
このクラスは、単純な動的 SQL により、
適切な索引を伴う表にアクセスする場合に最も適しています。
- 1
- アクセス・プランの生成に、
DB2 バージョン 1 に匹敵する最適化を行うことを指定します。
- 2
- DB2 バージョン 1 よりも高度な最適化を指定します。
ただし、特にきわめて複雑な照会の場合、
レベル 3 やそれ以降よりも最適化コストは大幅に低くなります。
- 3
- アクセス・プランの生成に、
中程度の最適化を行うことを指定します。
- 5
- アクセス・プランの生成に、かなり高度な最適化を行うことを指定します。
動的 SQL 照会が複雑な場合には、
アクセス・プランの選択にかかる時間を制限するのに発見的手法の規則が使用されます。
可能な場合、照会では基礎となる基礎表ではなく要約表が使用されます。
- 7
- アクセス・プランの生成に、
かなり高度な最適化を行うことを指定します。
5 とほとんど同じですが、発見的手法の規則が使用されない点が異なります。
- 9
- アクセス・プランの生成に、最大限の最適化を行うことを指定します。
これにより、評価対象のアクセス・プランの数は大幅に増大します。
このクラスは、大規模な表を使用するきわめて複雑で、実行に長時間を要する照会に対して、
より良いアクセス・プランを生成できるかどうかを判別する場合に使うようにしてください。
Explain とパフォーマンス測定値を使用することにより、
効率的なプランが生成されたかどうかを検証することができます。
- host-variable
- データ・タイプは INTEGER です。
値は、0 〜 9 の範囲内である必要があります (SQLSTATE 42815)。
ただし、値は、0、1、2、3、5、7、または 9 のいずれかでなければなりません (SQLSTATE 01608)。
host-variable が標識変数を伴っている場合、
その標識変数の値は NULL 値以外でなければなりません (SQLSTATE 42815)。
注
- CURRENT QUERY OPTIMIZATION レジスターを特定の値に設定すると、
一連の照会書き直し規則が有効になり、特定の最適化変数が特定の値になります。
該当のクラスの最適化手法が、動的 SQL ステートメントの準備の過程で使用されます。
- 一般に、最適化クラスの変更は、アプリケーションの実行時間、
コンパイル時間、および必要な資源に影響を与えます。
多くのステートメントは、デフォルトの照会最適化クラスを用いて適切な最適化が行われます。
動的 SQL ステートメントに対して、動的 PREPARE が消費する資源が、
照会の実行に必要な資源のかなりの部分を占める場合には、
低い照会最適化クラス (特にクラス 1 と 2) が動的 SQL ステートメントに適している場合があります。
より高いレベルの最適化クラスは、消費する資源がどれだけ増えるかを検討し、
より良いアクセス・プランが生成されたことを確認して初めて、選択するようにしてください。
それぞれの照会最適化クラスの詳細については、管理の手引き を参照してください。
- 照会最適化クラスは、0 〜 9 の範囲でなければなりません。
この範囲外のクラスは、エラーになります (SQLSTATE 42815)。
この範囲内でサポートされていないクラスを指定すると、
警告 (SQLSTATE 01608) が戻され、より低い次の照会最適化クラスで置き換えられます。
たとえば、照会最適化クラス 6 は 5 に置き換えられます。
- 動的に準備されるステートメントは、
最近時に実行された SET CURRENT QUERY OPTIMIZATION ステートメントによって設定された最適化クラスを使用します。
SET CURRENT QUERY OPTIMIZATION ステートメントがまだ実行されていない場合、
照会最適化クラスはデータベース構成パラメーター dft_queryopt によって決まります。
- 静的にバインドされたステートメントでは、CURRENT QUERY OPTIMIZATION 特殊レジスターを使用しません。
したがって、このレジスターはそれらのステートメントに影響を与えません。
静的にバインドされたステートメントに対する必要な最適化クラスの指定には、
前処理またはバインドの過程で QUERYOPT オプションが使用されます。
QUERYOPT の指定がない場合は、
データベース構成パラメーター dft_queryopt によって指定されたデフォルト値が使用されます。
詳細については、コマンド解説書 の BIND コマンドの項を参照してください。
- SET CURRENT QUERY OPTIMIZATION ステートメントが実行される作業単位がロールバックされても、
このステートメントの実行結果はロールバックされません。
例
例 1:
この例は、最も程度の高い最適化を選択する方法を示しています。
SET CURRENT QUERY OPTIMIZATION 9
例 2:
以下の例は、
照会の中で CURRENT QUERY OPTIMIZATION 特殊レジスターを使用する方法を示しています。
以下の例は、SYSCAT.PACKAGES カタログ視点を使用して、
CURRENT QUERY OPTIMIZATION 特殊レジスターの現行値と同じ設定でバインドされたすべてのプランを検索しています。
EXEC SQL DECLARE C1 CURSOR FOR
SELECT PKGNAME, PKGSCHEMA FROM SYSCAT.PACKAGES
WHERE QUERYOPT = CURRENT QUERY OPTIMIZATION
[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]