Pour répondre aux questions originales Mile ...
Avance rapide, lecture seule, les curseurs statiques (affectueusement connu sous le nom d'un « curseur Hose ») sont généralement aussi vite ou plus vite qu'un Temp Table équivalente et une boucle While car un tel curseur n'est rien de plus qu'une Table Temp et une boucle While qui a été optimisée un peu en coulisse.
Pour ajouter à ce que Eric Z. Beard affiché sur ce fil et de répondre à la question plus de ...
« Est-ce tous les discours de ne pas utiliser les curseurs vraiment à éviter l'utilisation des curseurs lorsque des approches basées sur des ensembles sont disponibles, et l'utilisation de curseurs modifiables, etc.
Oui. À quelques exceptions près, il faut moins de temps et moins de code pour écrire le bon code pour faire la même chose que la plupart des curseurs et a l'avantage d'utiliser beaucoup moins de ressources et beaucoup plus vite qu'un curseur ou une boucle While. D'une manière générale, et à l'exception de certaines tâches administratives, elles devraient être évitées au profit d'un code basé sur des ensembles correctement écrit. Il y a, bien sûr, des exceptions à chaque "règle" mais, dans le cas des curseurs, des boucles While, et d'autres formes de RBAR, la plupart des gens peuvent compter les exceptions d'une part sans utiliser tous les doigts. ;-)
Il y a aussi la notion de "RBAR caché". C'est un code qui semble basé sur un ensemble, mais qui ne l'est pas. Ce type de code «basé sur un ensemble» est la raison pour laquelle certaines personnes ont adopté les méthodes RBAR et disent qu'elles sont «OK». Par exemple, la résolution du problème du total cumulé à l'aide d'une sous-requête agrégée (SUM) avec une inégalité pour générer le total cumulé n'est pas vraiment définie dans mon livre. Au lieu de cela, c'est RBAR sur les stéroïdes parce que, pour chaque ligne calculée, il doit «toucher» de nombreuses autres lignes à un rythme de N * (N + 1)/2. C'est ce que l'on appelle une "jointure triangulaire" et elle est au moins aussi mauvaise qu'une jointure cartésienne complète (Cross Join ou "Square Join").
Bien que MS ait apporté des améliorations à la façon dont les curseurs fonctionnent depuis SQL Server 2005, le terme «curseur rapide» est toujours un oxymore par rapport au code basé sur les ensembles correctement écrit. Cela est également vrai même dans Oracle. J'ai travaillé avec Oracle pendant 3 ans dans le passé, mais mon travail consistait à améliorer les performances du code existant. La plupart des améliorations vraiment substantielles ont été réalisées lorsque j'ai converti des curseurs en code basé sur un ensemble. De nombreux travaux qui nécessitaient auparavant 4 à 8 heures d'exécution étaient réduits à quelques minutes et parfois à quelques secondes.
Bien que les curseurs soient utilisés avec succès dans Oracle PL/SQL, cela n'a aucune incidence sur leur utilisation dans SQL Server. La dernière fois que j'ai utilisé Oracle, vous ne pouviez pas écrire des instructions INSERT ... FROM ou UPDATE ... FROM et vous deviez donc utiliser des curseurs. Les modèles de verrouillage sont entièrement différents, donc je ne pense pas que la comparaison soit juste. –
Non, Simon. Ce n'est ni "obsolète" ni "incorrect". Bien que MS puisse avoir amélioré la façon dont les curseurs sont traités et à l'exception de certaines tâches administratives, les curseurs sont nécessairement pire que le code basé sur les ensembles correctement écrit ... même dans Oracle. –