Asynchrones Auffüllen

MicrosoftSQL Server bietet eine Leistungsoptimierung durch das asynchrone Auffüllen großer keysetgesteuerter oder statischer Cursor. Keysetgesteuerte und statische Cursor verwenden Arbeitstabellen, die in tempdb erstellt werden. Ein keysetgesteuerter Cursor verwendet die jeweilige Arbeitstabelle, um das Keyset zu speichern. Ein Keyset ist die Menge von Schlüsseln, die die Zeilen des zugehörigen Cursors identifizieren. Statische Cursor verwenden Arbeitstabellen, um die Zeilen zu speichern, aus denen der Cursor besteht. Wenn der SQL Server-Abfrageoptimierer davon ausgeht, dass die Anzahl der in einem keysetgesteuerten oder statischen Cursor zurückgegebenen Zeilen den Wert des sp_configure cursor threshold-Parameters überschreitet, startet der Server einen gesonderten Thread, um die Arbeitstabelle aufzufüllen. Die Anwendung übernimmt die Steuerung sofort wieder und kann mit dem Abrufen der ersten Zeilen im Cursor beginnen, anstatt mit dem Ausführen des ersten Abrufvorgangs warten zu müssen, bis die Arbeitstabelle aufgefüllt wird.

Das asynchrone Auffüllen eines Cursors ist mit zusätzlichem Aufwand verbunden. Es ist effizienter, kleine Cursor nicht asynchron aufzufüllen; deshalb sollte der sp_configure cursor threshold-Wert nicht zu niedrig festgelegt werden. Behalten Sie die Verwendung des asynchronen Auffüllens ausschließlich großen Cursorn vor.

HinweisHinweis

SQL Server unterstützt nicht das asynchrone Generieren von keysetgesteuerten oder statischen Transact-SQL-Cursorn. Transact-SQL-Cursorvorgänge, wie z. B. OPEN oder FETCH, sind in Batches enthalten. Daher ist das asynchrone Generieren von Transact-SQL-Cursorn nicht erforderlich. In SQL Server werden weiterhin asynchrone keysetgesteuerte oder statische API (Application Programming Interface)-Servercursor unterstützt, wobei OPEN mit geringer Latenzzeit ein Problem darstellt. Dies ist auf Clientroundtrips zurückzuführen, die für jeden Cursorvorgang ausgeführt werden.

Die @@CURSOR_ROWS-Funktion meldet die Anzahl von Zeilen in einem Cursor. Wenn Sie @@CURSOR_ROWS für einen Cursor mit einer Arbeitstabelle ausführen, die noch immer aufgefüllt wird, gibt @@CURSOR_ROWS eine negative Zahl zurück. Der absolute Wert der zurückgegebenen Zahl entspricht der Anzahl von Zeilen, die bis zu diesem Zeitpunkt in der Arbeitstabelle aufgefüllt wurden. Wenn beispielsweise @@CURSOR_ROWS ausgeführt wird, während das Keyset eines keysetgesteuerten Cursors noch immer aufgefüllt wird, sich jedoch bereits 1.243 Schlüssel im Keyset befinden, gibt @@CURSOR_ROWS den Wert -1243 zurück.