データの非同期格納

MicrosoftSQL Server では、サイズの大きなキーセット ドリブン カーソルまたは静的カーソルに非同期にデータを格納する際のパフォーマンスを最適化できます。キーセット ドリブン カーソルと静的カーソルは、tempdb に作成された作業テーブルを使用します。キーセット ドリブン カーソルは、この作業テーブルを使用して、それが持つキーセット、つまりカーソル内の行を識別するキーのセットを格納します。静的カーソルは、この作業テーブルを使用して、そのカーソルを構成する行を格納します。SQL Server のクエリ オプティマイザで、キーセット ドリブン カーソルまたは静的カーソル内に返される行の数が sp_configure cursor threshold パラメータの値を超えると評価した場合、サーバーにより別個のスレッドが起動され作業テーブルに行が格納されます。制御はすぐにアプリケーションに返されるので、作業テーブル全体にデータが格納されるまで待たなくても、カーソル内にある最初の行のフェッチを開始できます。

カーソルへのデータ設定を非同期に行うことに関連していくらかは余分なオーバーヘッドが生じます。サイズの小さいカーソルにデータを非同期に格納しなければ効率は上がるので、sp_configure cursor threshold をあまり低い値に設定しないでください。データの非同期設定の機能はサイズの大きいカーソルを作成する場合に使用するようにしてください。

注意注意

SQL Server では、キーセット ドリブン カーソルまたは静的 Transact-SQL カーソルの非同期な作成がサポートされません。OPEN や FETCH などの Transact-SQL カーソル操作は、一括処理されます。したがって、Transact-SQL カーソルを非同期に生成する必要がありません。SQL Server では、各カーソル操作に対するクライアントのラウンド トリップによる低待機時間の問題が OPEN にある場合、非同期のキーセット ドリブンまたは静的な API (アプリケーション プログラミング インターフェイス) サーバー カーソルが引き続きサポートされます。

@@CURSOR_ROWS 関数はカーソル内の行数を通知します。まだ作業テーブルへのデータ格納中であるカーソルに対して @@CURSOR_ROWS を選択した場合、@@CURSOR_ROWS は負の数を返します。返された数の絶対値が、その時点までに作業テーブル内に格納された行の数です。たとえば、キーセット ドリブン カーソルのキーセットがデータの格納中であっても、既に 1,243 個のキーがキーセット内に設定された時点で @@CURSOR_ROWS が選択された場合、@@CURSOR_ROWS は -1243 という値を返します。