ALWCPYDTA (アクセス・プランと実行環境)

DB2/400 が SQL を実行するに際して、どういう順序でどういうアクセス方法を使って行うか、という戦略が「アクセス・プラン」と呼ばれるものになります。
実際の実行は「オープン・データ・パス」といわれるものでなされるのですが、会社を経営するときの事業戦略のように、まずはこのアクセス・プランが大事です。

アクセス・プランは以前ちょっと見たように、アクセス先のテーブルの情報 (どんなデータがどう入っているか(統計)/どんなインデックスがあるか) の他に、実行される環境情報をも鑑みて策定されます。
つまり、オプティマイザーはこのアクセス・プランをその実行される環境に応じて変化させる、ということになります。

今回はその実行環境の情報として、ALWCPYDTA (データの一時コピーを許すかどうか) の値を例にとって、アクセス・プランがどんなふうに変わるのかを簡単に見てみたいと思います。


以前と同じ埋め込み SQL のプログラムを、ALWCPYDTA オプションだけを変更して作成してみます。
(ソースはまったく同じものを使っています。実行しているサブシステムなども一緒です。ですから CPU もプールに割り当てられているメモリーの量も同じですね。これ以外の実行環境値は同じということになります)

PRTSQLINF コマンドでアクセス・プランの情報を見てみましょう。

参考までに、こちらが ALWCPYDTA(*OPTIMIZE) の時のアクセス・プランです。
こちらには「再使用可能な ODP ソートが使用された」とか「ハッシュ結合結果に一時テーブルが作成された」といった、データの一時コピーを使うようなアクセス方法が使われていますが、ALWCPYDTA(*YES) での実行結果ではそれがなくなっていることがわかりますね。

と、ここまで見ると ALWCPYDTA(*YES) で一時テーブルがかえって使用されなくなる?! って思いませんか。

この事象に関しては、インフォメーション・センターに以下のような記述があります。

>>
一例として、次の SQL ステートメントを考えてください。

EXEC SQL
DECLARE C1 CURSOR FOR
SELECT EMPNO, LASTNAME, WORKDEPT
FROM CORPDATA.EMPLOYEE
WHERE WORKDEPT = 'A00'
ORDER BY LASTNAME
END-EXEC.

 <中略>

上記の例で、ALWCPYDTA(*NO) または ALWCPYDTA(*YES) を指定すると、データベース・マネージャーは、そのような索引が存在すれば、LASTNAME という名前の列を持つ最初の索引から索引を作成することを試みます。この索引を使用してテーブル内の行が走査され、WHERE 条件に合致する行のみが選択されます。

ALWCPYDTA(*OPTIMIZE) の指定があるときは、データベース・マネージャーは WORKDEPT の最初の索引列を持つ索引を使用します。次にデータベース・マネージャーは WHERE 条件に合致するすべての行のコピーを作成します。最後に、データベース・マネージャーは、コピーされた行を LASTNAME の値によって分類します。この行選択は、使用する索引によって選択する行が直ちに見つかるため、はるかに効率がよくなります。
>>

要は、ALWCPYDTA(*YES) というのは ALWCPYDTA(*NO) の場合と同じように、まず ORDER BY で合致するようなインデックスを探し、それがない場合に ALWCPYDTA(*YES) であればインデックスを作成し、*NO であればそのままにしておくというロジックになっているようです。

別の記事にさらにちょっと興味深い記述があります。(SQE 登場以前の記事ですが、CQE に関しての挙動は変わりません。一時インデックスが作成される条件とその影響について、かなり参考になります)

The *YES setting actually means maybe. The Optimizer has the power to create a copy of the data if and only if this is the only way the query could possibly execute. This setting virtually biases the Optimizer to use or create indexes to implement the query, copies of the data are considered only as a last resort.
The *OPTIMIZE setting means yes, full permission is granted to make copies of the data. The Optimizer can choose to make a copy of the data if it believes that this is the most efficient way to implement the query.

上の記述を見ると、*OPTIMIZE の場合は自由にストラテジーを選択できるが、*YES の場合は *NO の時と同じような考え方で選択を行い、最後の手段として一時インデックス等を作成できるか、という違いのようです。なんとなく *YES でイメージしている動きとは、たいていの人は違うのではないでしょうか。

単純に言ってしまうと、上に記述があるように ALWCPYDTA(*OPTIMIZE) と指定しておけば、一時インデックスより選択肢の範囲が多くなり、結果としてより効率のよいアクセス方法を実装することができそうです。

ALWCPYDTA(*NO) の場合のアクセス・プランです。
ALWCPYDTA(*YES) の時と同じものですね。

[Top Pageに戻る]

Ads by TOK2