Remplissage asynchrone

MicrosoftSQL Server prend en charge le remplissage asynchrone de curseurs pilotés par jeux de clés volumineux ou statiques. Les curseurs pilotés par jeux de clés et les curseurs statiques utilisent des tables de travail créées dans tempdb. Les curseurs pilotés par jeux de clés utilisent les tables de travail pour y stocker leur jeu de clés, le jeu de clés identifiant les lignes d'un curseur. Les curseurs statiques utilisent la table de travail pour y stocker les lignes comprises dans le curseur. Si l'optimiseur de requête de SQL Server estime que le nombre de lignes retournées dans un curseur piloté par jeu de clés ou un curseur statique dépassera la valeur du paramètre sp_configure cursor threshold, le serveur démarre un thread séparé pour remplir la table de travail. Le contrôle est immédiatement retourné à l'application qui peut commencer à extraire les premières lignes du curseur au lieu d'attendre que la totalité de la table de travail soit remplie avant de procéder à la première extraction.

Le remplissage asynchrone d'un curseur entraîne une certaine surcharge du système. Comme il est plus efficace de ne pas remplir les petits curseurs de façon asynchrone, le paramètre sp_configure cursor threshold ne doit pas avoir une valeur trop faible. Réservez la méthode de remplissage asynchrone aux curseurs volumineux.

[!REMARQUE]

SQL Server ne prend pas en charge la génération asynchrone de curseurs Transact-SQL pilotés par jeux de clés ou statiques. Les opérations de curseurs Transact-SQL comme OPEN ou FETCH s'effectuent généralement par lots ; c'est pourquoi la génération asynchrone de curseurs Transact-SQL n'est pas nécessaire. SQL Server prend toujours en charge les curseurs côté serveur d'API asynchrones pilotés par jeu de clés ou statiques lorsqu'une opération OPEN à faible latence pose un problème en raison du nombre de boucles de clients pour chaque opération de curseur.

La fonction @@CURSOR_ROWS spécifie le nombre de lignes d'un curseur. Si vous sélectionnez @@CURSOR_ROWS sur un curseur dont la table de travail est en cours de remplissage, @@CURSOR_ROWS retourne un nombre négatif. La valeur absolue du nombre retourné est le nombre de lignes ayant été remplies dans la table de travail jusqu'à présent. Par exemple, si @@CURSOR_ROWS est sélectionné lorsque le jeu de clés d'un curseur piloté par jeu de clés est encore en cours de remplissage, mais que 1 243 clés sont déjà dans le jeu de clés, @@CURSOR_ROWS retourne la valeur -1 243.