Ce qui se passe quand vous oubliez de fermer et libérer le curseur?
En laissant le curseur ouvert est connu comme une mauvaise pratique. Mais ce qui se passe réellement lorsque vous oubliez de fermer et/ou désallouer? Comment affectent-SQL Server, la connexion/session?
Existe-il des différences dans les conséquences pour les requêtes, procédures stockées et les déclencheurs de l'utilisation de curseurs?
Vous devez vous connecter pour publier un commentaire.
Cela dépend si vous avez déclaré le curseur localement ou globalement (et ce qui est la valeur par défaut dans votre environnement par défaut est globale, mais vous pouvez le changer).
Si le curseur est mondial, alors il peut rester "en vie" dans SQL Server jusqu'à ce que le dernier morceau de code est touché dans le champ d'application dans lequel il a été créé. Par exemple, si vous appelez une procédure stockée qui crée un curseur global, puis d'appeler 20 autres procédures stockées, le curseur sera en direct sur, tandis que ceux des autres 20 procédures stockées sont en cours d'exécution, jusqu'à ce que l'appelant est hors de portée. Je crois qu'il va rester en vie au niveau de la session, pas le niveau de la connexion, mais je n'ai pas testé à fond. Si le curseur est déclaré en tant que local, alors il ne doit rester dans le champ de l'objet courant (mais encore une fois, c'est théorique, et je n'ai pas fait beaucoup de bas niveau, des tests de mémoire à confirmer).
Le concept général, cependant, devrait être: lorsque vous avez terminé avec quelque chose, dites-le.
Afin de faire mon curseurs aussi efficace que possible, j'ai toujours utiliser les déclarations suivantes:
J'ai également entendu qu'il peut y avoir des problèmes de mémoire si vous ne
CLOSE
ou seulementDEALLOCATE
j'ai donc toujours faire les deux quand je suis fait:Cependant combien de curseurs avez-vous d'où le nettoyage de cette syntaxe est-elle un problème? Si vous avez des centaines de curseurs dans votre système, qui est certainement un drapeau rouge pour moi.
MODIFIER
Comme un additif, je veux juste préciser que les curseurs en eux-mêmes ne sont pas mauvais. Ils sont souvent l'objet d'abus et de maltraitance, bien que mis en œuvre dans les cas où une plus efficace, à base de jeu de la solution pourrait ont été mises en œuvre, mais la personne chargée de rédiger la requête ne pouvait penser sur le plan procédural. Les quelques cas où les curseurs de sens:
CLOSE
etDEALLOCATE
?Pas la fermeture d'un curseur de garder les verrous actifs qu'elle détient sur les lignes où il est positionné.
Même après la fermeture d'une référence est maintenu à la structure des données, le curseur est à l'aide de (donc il peut être rouvert)
Ces structures sont spécifique à SQL server (si ce n'est pas seulement de l'espace mémoire ou les poignées ou les) et dépend de ce que le curseur est en train de faire, mais ils seront généralement des tables temporaires ou des ensembles de résultats de requête.
Pas libérer autant que je sache, n'a qu'à faire avec la performance. Ladite ressources restent alloués et donc avoir un effet négatif sur les performances du serveur.
ressources allouées à partir de (ouverte ou fermée, mais non libéré) les curseurs restent alloués jusqu'à ce que la session (ou connexion) est fermé
“Une variable de curseur ne pas être explicitement libéré. La variable est libéré implicitement quand elle est hors de portée.”
Référence: http://msdn.microsoft.com/en-us/library/ms188782.aspx