Frage

Ich weiß, dass wir dazu neigen, Cursor und Loops innerhalb von SQL Server zu jedem Preis zu vermeiden, aber in welchen Situationen benötigen Sie unbedingt prozedurale Abfragen, und Sie werden die Ergebnisse einfach nicht liefern?

Ich verstehe den Unterschied zwischen den beiden, ich bin einfach nie zu einer Situation gekommen, in der ich brauchen einen Cursor verwenden. Ich frage mich, ob es solche Situationen gibt.

War es hilfreich?

Lösung

In meinen Erfahrungen bin ich ein paar Mal aufgestiegen, als prozessuale/iterative Ansätze gerechtfertigt waren.

API ermöglicht nur Einzelreihenbetrieb

Wenn ich den Datentyp programmatisch von real zu dezimal ändern wollte Also Frage fragt, dass ein Cursor ein guter Ansatz ist, da der DDL nicht zulässt, dass mehrere Spalten in einer einzigen Anweisung geändert werden.

Set -basiert nicht skaliert

Wenn Sie das haben SQL Server MVP Deep Dives Buch, Kapitel 4 "Set-basierte Iteration: Die dritte Alternative" von Hugo Kornelis hat einige großartige Anwendungsfälle für kombinierte Cursor-/Set -basierte Operationen. Zwei der klassischen Probleme, auf die der Kapitelautor verweist, sind die Laufwerte und Behälterpackung.

Ich habe den set-basierten Iterationsansatz mit gutem Erfolg für einen schlecht gestalteten Prozess verwendet, den ich beim letzten Job geerbt habe. Kurz gesagt, es gab einen Prozess, dass einst im Jahr 50-75 Mio. Zeilen aktualisieren musste, und der Versuch, dies in einem einzigen Satz zu tun, würde unsere Protokolle blasen. Durch das Knabieren der Updates in kleinere Chargen von N -Zeilen, ermöglichte es dem Protokoll, sich auf dem Laufenden zu halten, und endete tatsächlich schneller als im Vorjahr, als sie gerade eine metrische Tonne mehr Speicherplatz bereitstellten.

Andere Tipps

Wenn etwas nicht erledigt werden kann.

Natürlich offensichtlich blutend. Beachten Sie jedoch, dass es einen Unterschied in "Nicht -Set -basiert" und Folk unter Verwendung einer prozeduralen Lösung gibt, da sie keine Sätze verstehen oder nicht wissen, wie es mit setbasiertem Code geht.

Ein Beispiel für den Verfahrenscode wäre das Senden einer E -Mail pro Zeile mit unterschiedlichen Inhalten pro Zeile

Viel SQL -Code für die DBA -Verwendung ist prozedural. Zum Beispiel Schleifen (Cursor oder while: Kein Unterschied) über Datenbanken und Tabellen zum Wiederaufbau von Indizes und Aktualisierung von Statistiken.

Einige SQL-Konstrukte ermöglichen eine zeilen-für-Reihen-Verarbeitung im Kontext eines Satzes, wie z. B. Cross wie diese auf SO: Wählen Sie die Top 5 Zeilen für jede FK aus (Beachten Sie jedoch auch die Lösung row_number ())

Bearbeiten: Erweitern Sie @Billinkcs Antwort ...

Cross Apply ermöglicht setbasierte Vorgänge mit UDFs mit einer "einzelnen Zeilen -API".

Ich weiß, dass Sie nach SQL Server fragen, aber in der Oracle -Welt (in der Vergangenheit) hatten temporäre Tabellen sehr hohe Kosten, sodass Cursor -basierte Verfahren und Trigger schneller und niedrigere "Kosten" für den Server waren. In SQL Server hatten Cursors früher weitaus höhere Kosten als TEMP -Tabellen, sodass das Schreiben von Cursor -basierten Code entmutigt wurde. Ich bin mir ziemlich sicher, dass diese Diskrepanzen in den letzten zehn Jahren beseitigt wurden.

Um mit diesen Situationen fertig zu werden, haben die meisten Menschen eine allgemeine Regel, um die Geschäftslogik in die Datenbank zu vermeiden. Wenn Sie das absolut immer tun können, gibt es weder in T-SQL noch PL/SQL keinen Grund für die prozedurale Logik. Relationale Datenbanken sind in der legbasierten Logik hervorragend. Die meisten modernen Programmiersprachen sind in prozeduraler Logik hervorragend. Es ist am besten, jeden für das zu verwenden, was sie gut können.

Einige Prüfungsauslöser, mit denen ich zusammengearbeitet habe, hatten ziemlich komplizierte Regeln für das, was überprüft werden musste und wo die Dinge aktualisiert/protokolliert werden mussten. Einige waren dafür, Berichterstattungssysteme synchron mit Transaktionssystemen zu halten (es war nicht meine Wahl, aber sie wollten es so). Einige waren für a Formeln System. Eine Formulierung ist eine Liste von Drogen und für jede Versicherungsgesellschaft, was sie nicht abdecken werden, und wenn sie drug_x vorgeschrieben sind, welche Ersetzungen durch Versicherungen abgedeckt sind. Es war auch üblich, dass verschiedene Gruppenrichtlinien bei derselben Versicherungsgesellschaft für verschiedene Medikamente bezahlen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top