Quand les requêtes procédurales sont-elles absolument nécessaires?


8

Je sais que nous avons tendance à éviter à tout prix les curseurs et les boucles dans SQL Server, mais quelles sont les situations dans lesquelles vous avez absolument besoin de requêtes procédurales et les requêtes basées sur des ensembles ne vous donneront tout simplement pas les résultats?

Je comprends la différence entre les deux, je ne suis juste jamais arrivé à une situation où je dois utiliser un curseur. Je me demande s'il y a de telles situations.

Réponses:


9

D'après mon expérience, je suis tombé sur plusieurs fois où des approches procédurales / itératives étaient justifiées.

L'API permet uniquement le fonctionnement sur une seule ligne

Si je voulais changer par programme le type de données de réel en décimal dans une table qui a 500 colonnes mal typées comme le demande cette question SO , un curseur est une bonne approche car le DDL ne permet pas de modifier plusieurs colonnes dans une seule instruction.

Le jeu basé sur n'est pas mis à l'échelle

Si vous avez le livre SQL Server MVP Deep Dives , le chapitre 4 "Itération basée sur les ensembles: la troisième alternative" par Hugo Kornelis a de très bons cas d'utilisation pour les opérations combinées curseur / ensemble. Deux des problèmes classiques auxquels l'auteur du chapitre fait référence sont les totaux en cours d'exécution et le conditionnement des bacs .

J'ai utilisé l'approche d'itération basée sur des ensembles avec un bon succès pour un processus mal conçu dont j'ai hérité lors du dernier travail. En bref, il y avait un processus qui, une fois par an, devait mettre à jour 50 à 75 millions de lignes et tenter de le faire en un seul ensemble ferait exploser nos journaux. En segmentant les mises à jour en lots plus petits de N lignes, cela a permis au journal de se maintenir et de se terminer plus rapidement que l'année précédente quand ils venaient d'allouer une tonne métrique d'espace disque supplémentaire.


6

Quand quelque chose ne peut pas être fait sur la base d'un ensemble.

Des saignements évidents bien sûr. Mais notez qu'il y a une différence entre "non basé sur les ensembles" et les gens qui utilisent une solution procédurale parce qu'ils ne comprennent pas les ensembles ou ne savent pas comment le faire avec du code basé sur les ensembles.

Un exemple de code procédural serait l'envoi d'un e-mail par ligne avec un contenu différent par ligne

Beaucoup de code SQL pour DBA est procédural. Par exemple, bouclage (CURSOR ou WHILE: aucune différence) sur les bases de données et les tables pour reconstruire les index et mettre à jour les statistiques.

Certaines constructions SQL permettent un traitement ligne par ligne dans le contexte d'un ensemble, comme CROSS APPLY comme ceci sur SO: SELECT TOP 5 lignes pour chaque FK (notez cependant la solution ROW_NUMBER () aussi)

Edit: étendre la réponse de @ billinkc ...

CROSS APPLY permet des opérations basées sur des ensembles avec des FDU qui ont une "API à une seule ligne"


2

Je sais que vous posez des questions sur SQL Server, mais dans le monde Oracle (dans le passé), les tables temporaires avaient un coût très élevé, donc les procédures et les déclencheurs basés sur le curseur étaient plus rapides et plus «économiques» pour le serveur. Dans SQL Server, les curseurs avaient un coût beaucoup plus élevé que les tables temporaires, il était donc déconseillé d'écrire du code basé sur le curseur. Je suis presque sûr que ces écarts ont été éliminés au cours de la dernière décennie.

Pour faire face à ces situations, la plupart des gens ont une règle générale pour éviter de mettre la logique métier dans la base de données. Si vous pouvez absolument toujours le faire, alors il n'y aura aucune raison de logique procédurale dans T-SQL ni PL / SQL. Les bases de données relationnelles sont excellentes dans la logique basée sur les ensembles. La plupart des langages de programmation modernes sont parfaits pour la logique procédurale. Il est préférable d'utiliser chacun pour quoi il est bon.

Certains déclencheurs d'audit avec lesquels j'ai travaillé avaient des règles assez compliquées pour ce qui devait être vérifié et où les choses devaient être mises à jour / enregistrées. Certains étaient pour garder les systèmes de rapports synchronisés avec les systèmes transactionnels (ce n'était pas mon choix, mais ils le voulaient de cette façon). Certains étaient pour un système de formulaire . Un formulaire est une liste de médicaments, et pour chaque compagnie d'assurance, ce qu'ils couvriront / ne couvriront pas et, si prescrit drug_X, quels remplacements sont couverts par l'assurance. Il était également courant que différentes polices collectives d'une même compagnie d'assurance paient des médicaments différents.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.