cursor threshold オプション

cursor threshold オプションは、カーソル キーセットが非同期に生成される際の基準となる、カーソル セットの行数を指定する場合に使用します。カーソルが結果セットのキーセットを生成するとき、その結果セットに返される行数をクエリ オプティマイザーが予測します。返される行数がこのしきい値を超えていると予測された場合、カーソルは非同期に生成されます。これにより、ユーザーはカーソルの作成が続行されている間に行を取り出すことができます。返される行数がこのしきい値以下と予測された場合、カーソルは同期をとって生成され、すべての行が返されるまでクエリが待機します。

cursor threshold を -1 に設定すると、すべてのキーセットが同期をとって生成されます。これはカーソル セットが小さい場合に役立ちます。cursor threshold を 0 に設定すると、すべてのカーソル キーセットが非同期に生成されます。それ以外の値を設定した場合、クエリ オプティマイザーによってカーソル セットの予測行数が比較され、cursor threshold に設定した値を超えていれば、キーセットが非同期に生成されます。小さな結果セットは同期をとって作成する方がよいので、cursor threshold の値は小さくしすぎないでください。

注意

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

キーセットの行数を予測するクエリ オプティマイザーの精度は、カーソル内の各テーブルの統計の新しさによって左右されます。

cursor threshold オプションは拡張オプションです。sp_configure システム ストアド プロシージャを使用して cursor threshold の設定を変更するには、show advanced options を 1 に設定する必要があります。新しい設定は、サーバーを再起動しなくてもすぐに有効になります。

カーソルを非同期に設定するには、カーソルの作成をユーザー トランザクションにラップする必要があります。

EXEC sp_configure 'show advanced options', 1;
RECONFIGURE
EXEC sp_configure 'cursor threshold', 0;
RECONFIGURE
DECLARE @cursorId INT

BEGIN TRANSACTION
       EXEC sp_cursoropen @cursorId OUTPUT, 'SELECT * FROM sys.all_objects', 8
       SELECT @cursorId
       SELECT session_id, cursor_id, properties, is_async_population FROM sys.dm_exec_cursors(0);
COMMIT TRANSACTION

EXEC sp_cursorfetch @cursorId
EXEC sp_cursorclose @cursorId

EXEC sp_configure 'show advanced options', 1;
RECONFIGURE
EXEC sp_configure 'cursor threshold', 0;
RECONFIGURE
DECLARE @cursorId INT

BEGIN TRANSACTION
       EXEC sp_cursoropen @cursorId OUTPUT, 'SELECT * FROM sys.all_objects', 8
       SELECT @cursorId
       SELECT session_id, cursor_id, properties, is_async_population FROM sys.dm_exec_cursors(0);
COMMIT TRANSACTION

EXEC sp_cursorfetch @cursorId
EXEC sp_cursorclose @cursorId