PRTSQLINF (アクセス・プランとは?)

データベース・エンジンは SQL を実行する前に、構文解析を行い、その実行が初回であればアクセス・プランというものを作成します。 (二回目以降であればアクセス・プランの実効性を再度判断します)

アクセス・プランとは、データベース一般で言う"実行計画"に相当するものです。
例えば、SQL を構文解析して最適な関係代数の演算にすること "プラン"と言われますし、それをどんなアクセス方法 (テーブル全部をスキャンするのか、どのインデックスを使うのか、どう結合させるのか、結合の順番は? ... etc ) で実装するのかも"プラン" と言います。
データベース学としてはそれぞれを分けて考えるのは有効ですが、実際にデータベースを実行する立場としては上記のそれぞれを分ける必要はありませんね。DB2/400 では双方をあわせて「アクセス・プラン」と呼びます。

アクセス・プランはそれでもやはり"プラン"なので、実際に実行する時はデータにアクセスするための「オープン・データ・パス」といわれるものの生成が必要になります。ある意味、これが"実体"ですね。

オープン・データ・パス」ですが、インフォメーション・センターの「照会最適化パフォーマンス通知メッセージおよびオープン・データ・パス」には以下のような記述がありました。

オープン・データ・パス (ODP) 定義は、カーソルがオープンされるとき、または他の SQL ステートメントが実行されるときに作成される内部オブジェクトです。 ODP はデータとの直接リンクを提供し、入出力操作を可能にします。 ODP は OPEN、INSERT、UPDATE、DELETE、および SELECT INTO の各ステートメントで使用されて、データに対してそれぞれの操作を行います。

別の資料には

the Open Data Path is the actual pipe for moving data between the database and your applications.
The ODP is the object coordinating and controlling the low-level movement of the data to and from the application.

いわゆる「ファイルのオープン」なので、かなり"重い"処理になります。
そのため、いかに再利用するか、がパフォーマンスの観点から重要です。

ODPs live in working memory of the job associated with the SQL request.
In the case of SQL, and ODP is created for each unique SQL request in the application. Since ODPs are stored in memory, they have a direct impact on the memory footprint if an application.

「オープン・データ・パスの数」というのがありますね。

オープン・データ・パスは実行時に生成されるもので、ジョブの中でしか再利用はできません。JDBC アクセスなどの場合は、事前開始ジョブの中で再利用させることになりますね。
同じ SQL でも、ライブラリーが違う、というような場合は再利用できません。違うファイルになりますのでデータの量や分布も違います。同じ ODP を使う、ということに意味がないですね。

アクセス・プランには、大きくわけると以下の 3つの情報が入っています。

実行環境の情報

テーブルやインデックスの情報

アクセス方法


PRTSQLINF コマンドでどんなアクセス・プランが格納されているかを見ることができます。
全部が見れるわけではありませんが、だいたいどんなものかがわかりますので、ちょっと見てみましょう。

SQL の実行形態には埋め込み SQL (= 静的 SQL) と動的 SQL という二つのやり方があります。
DB2/400 の場合、アクセス・プランの再利用のために SQL パッケージというものが使用できるようになっている拡張動的 SQLというものが、通常の動的 SQL の他にあります。

PRTSQLINF コマンドでは、埋め込み SQL があるプログラムか拡張動的 SQL の SQL パッケージを対象にすることができます。
通常の動的 SQL の場合、ジョブのメモリー上にしか存在しないため直接見ることができません。

こちらで使用した SQL を例にとって見てみます。

まず、プログラムに埋め込むために、テーブルへの INSERT に変換します。
INSERT する先のテーブルを作成しておきます。

CREATE TABLE VETEAM01/RESULT1
("YEAR" SMALLINT NOT NULL WITH DEFAULT,
"MONTH" SMALLINT NOT NULL WITH DEFAULT,
SUPPLIER CHAR (25) CCSID 1027 NOT NULL WITH DEFAULT,
ORDERKEY DEC ( 16) NOT NULL WITH DEFAULT,
QUANTITY DEC ( 15, 2) NOT NULL WITH DEFAULT,
REVENUE_WO_TAX DEC ( 15, 2) NOT NULL WITH DEFAULT)

埋め込み SQL の場合は SQL の事前コンパイルを行いますので、それが"初回の実行"になってアクセス・プランが生成されます。
生成されたアクセス・プランはプログラムの一部になります。

PRTSQLINF コマンドでプログラムを指定して、どんなアクセス・プランが格納されているかを見てみましょう。

最初の方にあるのが、いわゆる"実行環境の情報"になります。

対象の SQL と、それに対するアクセス・プランが載っています。

埋め込み SQL のアクセス・プランだけを見やすく取り出すと以下のようなかんじですね。

SQL パッケージの場合を見てみましょう。

「SQL スクリプトの実行」で、Visual Explain を「実行および EXPLAIN」で実行させます。

SQL パッケージの該当 SQL の実行部分は以下のようになっています。
上の EXPLAIN 図を言葉で表したようなかんじになっていますね。

また、こちらにはプラン・キャッシュなどに使用されるためか、「STATEMENT NAME」という項目があり、対象の SQL に番号のようなものがついています。

ちなみに SQL パッケージに対する PRTSQLINF コマンドの出力の全体はこんなかんじです。

EXPLAIN 図を出すために実行された SQL らしきものも載っています。

[Top Pageに戻る]

Ads by TOK2