分散データにアクセスするアプリケーションのパフォーマンスの向上
リモート・データにアクセスするアプリケーションのパフォーマンスを改善するために重要なことは、ネットワーク伝送の回数を制限することです。
このタスクについて
リモートシステムに送信されたクエリは、同じクエリがローカルの Db2 サブシステムで実行される場合よりも、実行に時間がかかることがあります。 実行時間が長くなる主な理由は、次のとおりです。
- メッセージをネットワークを介して送るために要する時間
- 始動および通信サブシステム・セッション管理を含めた オーバーヘッド処理
オーバーヘッド処理の一部、例えばネットワーク処理などは、 Db2 の管理下にはありません。
分散環境におけるパフォーマンスのモニターおよびチューニング作業は、 複数の製品に関する知識を要する複雑な作業です。
プロシージャー
分散データにアクセスするアプリケーションのパフォーマンスを最大化するには、以下の方法を使用します。
- 次に示す推奨情報に従って分散データにアクセスする照会を作成することによって、これらの照会がネットワーク経由で送信するメッセージの数を制限します。
- 選択リストを可能な限り短くし、また WHERE、GROUP BY、および HAVING 文節を使用してリモート・サーバーで不必要なデータを排除することによって、結果表の列と行の数を減らします。
- 数千もの行を返す照会には、FOR FETCH ONLY 文節または FOR READ ONLY 文節を指定します。 その後、DBPROTOCOL(DRDACBF)オプションを指定して、これらの照会を含むアプリケーションをバインドし、Db2がパッケージ・ベースの連続ブロック・フェッチを使用して行を取り出すことができるようにします。 このタイプの連続ブロック・フェッチでは、リクエスターがカーソルごとにサーバーへの 2 次接続を開きます。 これにより、サーバーはすべてのカーソルのデータを同時に送信できるようになります。
この形式の連続ブロック・フェッチを使用すると、SQL ベースの連続ブロック・フェッチを使用した場合よりも、パフォーマンスが向上します。
- 結果テーブルが膨大な件数になる可能性があるものの、必要なのは限られた件数だけという問い合わせの場合は、FETCH FIRST n ROWS ONLY 句を指定します。この文節は、クライアント・プログラムに戻される行数を制限します。例えば、結果表から必要なのは 1 行だけであるとします。 次の例に示すように、FETCH FIRST 1 ROW ONLY 文節を追加できます。
この例では、FETCH FIRST 1 ROW ONLY 文節によって 15 件の不要なプリフェッチが回避されます。SELECT * FROM EMP OPTIMIZE FOR 1 ROW ONLY FETCH FIRST 1 ROW ONLY; - プログラムがリモート表の LOB 列にアクセスする場合は、次の技法を使用して、クライアントとサーバーの間で転送されるバイト数を最小限にすることができます。
- LOB ホスト変数の代わりに LOB ロケーターを使用します。
LOB 値の一部分だけをクライアントに保管したい場合、 または、クライアント・プログラムは LOB データを操作するだけで、 データのコピーを必要としない場合は、LOB ロケーターを使用することをお勧めします。 クライアント・プログラムが、サーバーからLOB列を検索してロケーターにすると、Db2は、4バイトのロケーター値のみをクライアントに転送し、LOB値全体を転送しません。
- ストアード・プロシージャーの結果セットを使用します。
ストアード・プロシージャーからクライアント・プログラムに LOB データを戻す場合には、 パラメーターでクライアントに LOB データを渡すのではなく、 結果セットを使用してください。 データを戻すのに結果セットを使用すると、LOB のマテリアライズが抑えられ、 アドレス・スペースの間でのデータの移動を少なくすることができます。
- CURRENT RULES特殊レジスターをDb2に設定します。
Db2サーバーがカーソルに対するOPENリクエストを受け取ると、サーバーはCURRENT RULES特殊レジスターの値を使用して、関連するステートメントがLOB値を検索するために使用する、ホスト変数のタイプを判別します。 CONNECTを実行する前にCURRENT RULES特殊レジスターにDb2の値を指定し、カーソルの最初のFETCHステートメントがLOB ロケーターを使用してLOB列の値を検索する場合、Db2では、カーソルをクローズするまで、その列の後続のすべてのFETCHステートメントに対して、LOBロケーターのみを使用することができます。 最初のFETCHステートメントがホスト変数を使用する場合、Db2では、カーソルをクローズするまで、その列の後続のすべてのFETCHステートメントに対してホスト変数だけを使用することができます。 ただし、CURRENT RULESの値を STDに設定すると、Db2では同じオープン・カーソルを使用して、LOB列をLOBロケーターまたはホスト変数のいずれかに取り出すことができます。
CURRENT RULES特殊レジスターには値STDがありますが、LOBデータを検索するときにプログラミングの柔軟性が向上しますが、Db2の値を使用するとパフォーマンスが向上します。 STD オプションを使用すると、サーバーは、FETCH ステートメントごとにネットワーク・メッセージを送受信して、 転送されるデータが LOB ロケーターであるか、 または LOB 値であるかを示す必要があります。 Db2オプションを使用すると、サーバーは最初のFETCHの後にLOBデータのサイズを認識するため、LOBデータ・サイズに関する追加メッセージは不要です。 サーバーは一度に複数のデータ・ブロックをリクエスターに送ることができます。 これによって、データ転送の合計時間が減ります。
例えば、あるユーザーが大量の従業員レコードをブラウズし、 その内のほんの数人の写真を見る必要があると仮定します。 サーバーでは、CURRENT RULES特殊レジスターはDb2に設定されます。 アプリケーションで、従業員レコードを選択するためのカーソルを宣言してオープンします。 このアプリケーションは、次にすべての写真データをフェッチして 4-byte バイトの LOB ロケーターに 入れます。 Db2は、FETCHステートメントごとに4バイトのLOBデータが戻されることを認識しているため、Db2は、多くの画像のロケーターを使用してネットワーク・バッファーを埋めることができます。 ユーザーが特定人物の写真を見たい場合、 このアプリケーションは、LOB ロケーターが参照する値を LOB ホスト変数に 割り当てることによって、サーバーからその写真を取り出すことができます。 この条件は、次のコードによって実現できます。SQL TYPE IS BLOB my_blob[1M]; SQL TYPE IS BLOB AS LOCATOR my_loc; ⋮ FETCH C1 INTO :my_loc; /* Fetch BLOB into LOB locator */ ⋮ SET :my_blob = :my_loc; /* Assign BLOB to host variable */ - LOB ホスト変数の代わりに LOB ロケーターを使用します。
- Db2 がブロックフェッチを使用してネットワーク上で送信されるメッセージの数を最小限に抑えることができるよう、可能な場合は各カーソルが以下の条件のいずれかを満たすようにしてください。
- カーソルが、FOR FETCH ONLY または FOR READ ONLY のどちらかの文節を指定して宣言されている。
- カーソルが順方向カーソルであり、かつそのカーソルの結果表が 読み取り専用である場合。
- カーソルが INSENSITIVE として宣言されている両方向スクロール・カーソルで、 カーソルの結果表が読み取り専用である。
- カーソルが SENSITIVE として宣言されている両方向スクロール・カーソルで、 カーソルの結果表が読み取り専用で、CURRENTDATA バインド・オプションの値が NO である。
- カーソルの結果表は読み取り専用ではないが、カーソルが未確定であり、
かつ CURRENTDATA バインド・オプションの値が NO である場合。カーソルは、以下に該当する条件がある場合に未確定です。
- そのカーソルの定義に文節 FOR FETCH ONLY、FOR READ ONLY、または FOR UPDATE が 使用されていない場合。
- 読み取り専用の結果表で定義されていない。
- SQL UPDATE または DELETE ステートメントの WHERE CURRENT 文節の ターゲットではない。
- SQL ステートメントの PREPARE または EXECUTE IMMEDIATE が入っているプランまたはパッケージ内にある。
- ODBC および JDBC アプリケーションの場合は、行セット・パラメーターを使用して、フェッチ操作から戻される行数を制限します。 DRDAリクエスタが Db2 サーバーにロウセットパラメータを送信すると、サーバーは以下のアクションを実行します
- 行セット・パラメーターの値を超えない行数を戻す。
- エクストラ照会ブロックを戻す (サーバー上 の DISTRIBUTED DATA FACILITY PANEL 2 インストール・パネルの EXTRA BLOCKS SRV フィールドの 値によってエクストラ照会ブロックの返送が許可されている場合)。
- FETCH FIRST n ROWS ONLY 文節を処理する (これが指定されている場合)。
- OPTIMIZE FOR n ROWS 文節を処理しない。
- 特定のバインド・オプションの推奨値を使用します。推奨されるバインドオプションの詳細については、「分散アプリケーションのBINDオプション」 を参照してください。