Preenchimento assíncrono
O MicrosoftSQL Server oferece uma otimização de desempenho para popular grandes cursores controlados por conjunto de chaves ou cursores estáticos de forma assíncrona. Os cursores controlados por conjuntos de chaves e os cursores estáticos usam tabelas de trabalho internas do tempdb. Os cursores controlados por conjuntos de chaves usam as tabelas de trabalho para armazenar seu conjunto de chaves que identifica as linhas no cursor. Os cursores estáticos usam uma tabela de trabalho para armazenar as linhas que compõem o cursor. Se o otimizador de consulta SQL Server estimar que o número de linhas retornado em um cursor controlado por conjunto de chaves ou estático excederá o valor do parâmetro sp_configure cursor threshold, o servidor iniciará um thread separado para popular a tabela de trabalho. O controle é imediatamente retornado ao aplicativo, que pode ser iniciado buscando as primeiras linhas no cursor, em vez de ter que esperar até que toda a tabela de trabalho tenha sido populada antes de executar a primeira busca.
Há alguma sobrecarga extra associada com a população de um cursor de forma assíncrona. É mais eficiente não popular cursores pequenos de forma assíncrona, assim o valor sp_configure cursor threshold não precisa ser definido muito baixo. Reserve o uso da população assíncrona para cursores grandes.
Observação |
---|
O SQL Server não oferece suporte à geração de cursores controlados por conjunto de chaves ou cursores estáticos Transact-SQL de forma assíncrona. Operações com o cursor Transact-SQL tais como OPEN ou FETCH são normalmente em lote, assim não há necessidade de geração assíncrona de cursores Transact-SQL. O SQL Server continua a oferecer suporte a cursores assíncronos de servidor comandados por conjunto de chaves ou de API (application programming interface) estática, onde a baixa latência de OPEN é uma preocupação, devido às viagens de ida e volta de cada operação do cursor. |
A função @@CURSOR_ROWS relaciona o número de linhas em um cursor. Se você selecionar @ @ CURSOR_ROWS em um cursor com uma tabela de trabalho que ainda está sendo populada, @ @ CURSOR_ROWS retornará um número negativo. O valor absoluto do número retornado é o número das linhas que foram populadas na tabela de trabalho até aquele momento. Por exemplo, se @ @ CURSOR_ROWS for selecionado enquanto o conjunto de chaves de um cursor comandado por conjunto de chaves ainda estiver sendo populado, mas 1.243 chaves já estiverem no conjunto de chaves, @ @ CURSOR_ROWS retornará um valor de -1243.