カーソルの種類の選択について

カーソルの種類の選択は、次に示すいくつかの可変要素によって異なります。

  • 結果セットのサイズ

  • 必要と思われるデータのパーセンテージ

  • カーソルを開く際のパフォーマンス

  • スクロールや位置指定更新など、カーソル操作の必要性

  • 他のユーザーが行ったデータ変更の可視性のレベル

更新を行わない場合、サイズの小さな結果セットには既定の設定で十分機能します。しかし、結果セットのサイズが大きい場合は、ユーザーが多数の行を取得する前に目的の結果が見つかる可能性があるので、動的カーソルの方が適しています。

取得されるデータをすべて一度に使用する場合、位置指定更新やスクロールの必要がなければ、既定の結果セットをお勧めします。SQL Server では、複数のアクティブな結果セット (MARS) の導入により、未処理の既定の結果セットを複数扱えないという制限がなくなりました。

カーソルの種類を選択する際の規則

カーソルの種類を選択する際に従うべき簡単な規則を以下に示します。

  • 可能であれば、既定の結果セットを使用します。スクロールが必要な場合、カーソルの実装をサーバーに任せるよりも、小さい結果セットをクライアント上でキャッシュし、そのキャッシュをスクロールする方が効率的です。

  • レポートを作成するときのように、結果セット全体をクライアントにフェッチする場合には既定の設定を使用します。既定の結果セットは、クライアントにデータを最も高速に送信する方法です。

  • アプリケーションが位置指定更新を使用している場合、既定の結果セットは使用できません。

  • 複数の結果セットを作成する Transact-SQL ステートメントまたは Transact-SQL ステートメントのバッチに対しては既定の結果セットを使用する必要があります。

  • 動的カーソルは、静的カーソルやキーセット ドリブン カーソルよりも速く開かれます。静的カーソルやキーセット ドリブン カーソルを開くときには内部的な一時作業テーブルを作成する必要がありますが、動的カーソルの場合には必要ありません。

  • キーセット ドリブン カーソルと静的カーソルを組み合わせると、動的カーソルよりも速くなります。

  • 絶対フェッチを行う場合、キーセット ドリブン カーソルまたは静的カーソルを使用する必要があります。

  • 静的カーソルとキーセット ドリブン カーソルを使用すると、tempdb の使用量が増加します。静的サーバー カーソルは tempdb にカーソル全体を作成し、キーセット ドリブン カーソルは tempdb にキーセットを作成します。

  • カーソルがロールバック処理中に開かれている必要がある場合は、同期静的カーソルを使用し、CURSOR_CLOSE_ON_COMMIT をオフに設定します。

サーバー カーソルを使用する場合、API フェッチ関数またはメソッドを呼び出すごとに、サーバーとの間にやり取りが発生します。アプリケーションは、ブロック カーソルを使用して 1 回のフェッチで多くの行を返すことにより、これらのやり取りを最小限に抑える必要があります。