Llenado asincrónico

MicrosoftSQL Server ofrece una optimización de rendimiento para llenar cursores grandes controlados por conjunto de claves o estáticos de forma asincrónica. Los cursores controlados por conjunto de claves y los cursores estáticos utilizan tablas de trabajo integradas en tempdb. Los cursores controlados por conjunto de claves utilizan la tabla de trabajo para almacenar su conjunto de claves, el cual identificará las filas en el cursor. Los cursores estáticos utilizan la tabla de trabajo para almacenar las filas que componen el cursor. Si el optimizador de consultas de SQL Server estima que el número de filas devueltas en un cursor controlado por conjunto de claves o en un cursor estático va a superar el valor del parámetro sp_configure cursor threshold, el servidor inicia un subproceso independiente para llenar la tabla de trabajo. Se devuelve el control a la aplicación inmediatamente para que pueda iniciar la recopilación de las primeras filas del cursor y no deba esperar a que se llene toda la tabla de trabajo antes de realizar la primera recopilación.

Existe cierta sobrecarga extra asociada con el llenado asincrónico de un cursor. Es más eficaz no llenar pequeños cursores de forma asincrónica, por lo que no se debería establecer sp_configure cursor threshold a un valor demasiado bajo. Reserve el llenado asincrónico para cursores grandes.

[!NOTA]

SQL Server no es compatible con la generación asíncrona de cursores de Transact-SQL estáticos o controlados por conjuntos de claves. Normalmente, las operaciones de cursor de Transact-SQL como OPEN o FETCH se realizan por lotes, por lo que la generación asincrónica de cursores de Transact-SQL no es necesaria. SQL Server continúa admitiendo los cursores de servidor de API o controlados por conjunto de claves asincrónicos en los que OPEN de baja latencia es un problema debido a los trayectos de ida y vuelta al cliente en cada operación del cursor.

La función @@CURSOR_ROWS informa del número de filas de un cursor. Si selecciona @@CURSOR_ROWS en un cursor con una tabla de trabajo que todavía se está llenando, @@CURSOR_ROWS devuelve un número negativo. El valor absoluto del número devuelto es el número de filas que se han llenado en la tabla de trabajo hasta el momento. Por ejemplo, si se selecciona @@CURSOR_ROWS mientras se está llenando el conjunto de claves de un cursor controlado por conjunto de claves, pero ya hay 1.243 claves en el conjunto de claves, @@CURSOR_ROWS devuelve el valor -1243.