SET CURRENT QUERY OPTIMIZATION ステートメント

SET CURRENT QUERY OPTIMIZATION ステートメントは、 CURRENT QUERY OPTIMIZATION 特殊レジスターに値を割り当てます。 この値は、動的 SQL ステートメントの準備の時点で使用される最適化手法の現行クラスを指定します。

このステートメントは、トランザクションの制御下にありません。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込んだり、動的 SQL ステートメントを使用して発行したりすることができます。 このステートメントは、動的に作成できる実行可能ステートメントです。

許可

必要ありません。

構文

構文図を読む構文図をスキップするSETCURRENTQUERYOPTIMIZATION =0123579host-variable

説明

optimization-class
optimization-class (最適化クラス) は、整数定数、 または実行時に適切な値が入れられるホスト変数の名前として指定することができます。 クラスの概要を以下に示します。
0
アクセス・プランの生成に、最低限の最適化が行われることを指定します。 このクラスは、適切な索引が付けられた表にアクセスする単純な動的 SQL の場合に最も適しています。
1
アクセス・プランの生成に、本製品の初期バージョンにほぼ相当する最適化を行うことを指定します。
2
レベル 1 よりも高い最適化レベルを指定します。 ただし、きわめて複雑な照会の場合は特に、レベル 3 以上を使用する場合よりも最適化コストは大幅に低くなります。
3
アクセス・プランの生成に、 中程度の最適化を行うことを指定します。
5
アクセス・プランの生成に、かなり高度な最適化を行うことを指定します。 動的 SQL 照会が複雑な場合には、 アクセス・プランの選択にかかる時間を制限するのに発見的手法の規則が使用されます。 可能な場合、照会では基礎となる基本表ではなくマテリアライズ照会表が使用されます。
7
アクセス・プランの生成に、かなり高度な最適化を行うことを指定します。 5 とほとんど同じですが、発見的手法の規則が使用されない点が異なります。
9
アクセス・プランの生成に、最大限の最適化を行うことを指定します。 これにより、評価対象のアクセス・プランの数は大幅に増大します。 このクラスは、大規模な表を使用するきわめて複雑で、実行に長時間を要する照会に対して、 より良いアクセス・プランを生成することを判別する場合に使うようにしてください。 Explain とパフォーマンス測定値を使用することにより、 効率的なプランが生成されたかどうかを検証することができます。
host-variable
データ・タイプは INTEGER です。値は、0 から 9 の範囲内である必要があります (SQLSTATE 42815)。 ただし、値は、0、1、2、3、5、7、または 9 のいずれかでなければなりません。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 データベース構成パラメーターによって指定されたデフォルト値が使用されます。
  • 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