Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - プログラミング » SQL Anywhere でのプログラミングの概要 » アプリケーションでの SQL の使用 » SQL Anywhere のカーソル » カーソルの感知性とパフォーマンス

 

ローのプリフェッチ

プリフェッチは複数ローのフェッチとは異なります。プリフェッチはクライアント・アプリケーションから明確な命令がなくても実行できます。プリフェッチはサーバからローを取り出し、クライアント側のバッファに格納しますが、クライアント・アプリケーションがそれらのローを使用できるのは、アプリケーションが適切なローをフェッチしてからになります。

デフォルトでは、単一ローがアプリケーションによってフェッチされるたびに、SQL Anywhere のクライアント・ライブラリが複数のローをプリフェッチします。SQL Anywhere のクライアント・ライブラリは余分なローをバッファに格納します。

プリフェッチはクライアント/サーバのラウンド・トリップを削減してパフォーマンスを高め、1 つのローやローのブロックごとにサーバへ個別に要求しないで多数のローを使用可能にすることによってスループットを高めます。

プリフェッチ制御の詳細については、prefetch オプション [データベース]を参照してください。

アプリケーションからのプリフェッチの制御
  • prefetch オプションを使って、プリフェッチするかどうか制御できます。単一の接続では prefetch オプションを [常に]、[条件付き]、または [オフ] に設定できます。デフォルトでは [条件付き] に設定されています。

  • Embedded SQL では、BLOCK 句を使用して、カーソルを開くときにカーソル・ベースで、または個別の FETCH オペレーションで、プリフェッチを制御できます。

    アプリケーションでは、サーバから 1 つのフェッチに含められるローの最大数を、BLOCK 句で指定できます。たとえば、一度に 5 つのローをフェッチして表示する場合、BLOCK 5 を使用します。BLOCK 0 を指定すると、一度に 1 つのレコードがフェッチされ、常に FETCH RELATIVE 0 が同じローを再度フェッチするようになります。

    アプリケーションの接続パラメータを設定してフェッチをオフにすることもできますが、prefetch オプションを Off に設定するよりは、BLOCK 0 と指定する方が効果的です。prefetch オプション [データベース]を参照してください。

  • value-sensitive カーソル・タイプでは、プリフェッチはデフォルトで無効です。

  • Open Client では、カーソルが宣言されてから開かれるまでの間に CS_CURSOR_ROWS で ct_cursor を使ってプリフェッチの動作を制御できます。

パフォーマンスが向上する可能性が高い場合に、プリフェッチするロー数が動的に増えます。これには、次の条件を満たすカーソルが含まれます。

  • カーソルがサポートされるカーソル・タイプのいずれかを使用している。

    • ODBC と OLE DB   前方専用および読み込み専用 (デフォルト) のカーソル

    • Embedded SQL   DYNAMIC SCROLL (デフォルト)、NO SCROLL、および INSENSITIVE のカーソル

    • ADO.NET   すべてのカーソル

  • カーソルが FETCH NEXT 操作のみ実行する (絶対フェッチ、相対フェッチ、後方フェッチは実行しない)。

  • アプリケーションが、フェッチの間にホスト変数の型を変更したり、GET DATA 文を使用してチャンク単位でカラムのデータ取得を行ったりしない (GET DATA 文を 1 つ使用して、値を取得することはできる)。