Ich verstehe, dass Sie nicht ORDER BY
in einer Ansicht haben können. (Zumindest in SQL Server 2012 arbeite ich mit)
Ich verstehe auch, dass die "richtige" Art, eine Ansicht zu sortieren, darin besteht, ORDER BY
die SELECT
Anweisung, die die Ansicht abfragt , mit einem Zirkel zu versehen.
Da ich jedoch relativ neu in der SQL-Praxis und in der Verwendung von Ansichten bin, möchte ich verstehen, warum dies so beabsichtigt ist. Wenn ich den Verlauf korrekt verfolgt habe, war dies einmal möglich und wurde explizit aus SQL Server 2008 usw. entfernt (zitieren Sie mich nicht in der genauen Version).
Der beste Grund, warum Microsoft diese Funktion entfernt hat, ist "eine Ansicht ist eine unsortierte Sammlung von Daten".
Ich gehe davon aus, dass es einen guten, logischen Grund gibt, warum eine Ansicht unsortiert sein sollte. Warum kann eine Ansicht nicht einfach eine abgeflachte Datensammlung sein? Warum gerade un -sortierte? Es scheint nicht so schwer zu sein, Situationen zu finden, in denen es (zumindest für mich / IMHO) vollkommen intuitiv erscheint, eine sortierte Ansicht zu haben.
quelle
Antworten:
(Abgesehen von indizierten Ansichten.)
Eine Ansicht wird nicht materialisiert - die Daten werden nicht gespeichert. Wie können sie also sortiert werden? Eine Ansicht ähnelt einer gespeicherten Prozedur, die nur eine
SELECT
ohne Parameter enthält. Sie enthält keine Daten, sondern nur die Definition der Abfrage. Da unterschiedliche Verweise auf die Ansicht möglicherweise Daten benötigen, die auf unterschiedliche Weise sortiert sind, müssen Sie bei dieser Vorgehensweise - genau wie bei der Auswahl aus einer Tabelle, bei der es sich definitionsgemäß auch um eine unsortierte Auflistung von Zeilen handelt - die Reihenfolge von in die äußere Abfrage aufnehmen .Auch um einen kleinen Einblick in die Geschichte zu geben. Man konnte nie setzen ,
ORDER BY
ohne darunter auch in einer AnsichtTOP
. Und in diesem Fall wurdeORDER BY
diktiert, von welchen Zeilen sie aufgenommen wurdenTOP
, und nicht, wie sie dargestellt würden. Es ist einfach so passiert , dass in SQL Server 2000, wennTOP
war100 PERCENT
oder{some number >= number of rows in the table}
der Optimierer ziemlich simpel war und es endete , einen Plan mit einer Art erzeugen , die die abgestimmtTOP/ORDER BY
. Dieses Verhalten wurde jedoch nie garantiert oder dokumentiert - es beruhte lediglich auf Beobachtungen, was eine schlechte Angewohnheit ist . Als SQL Server 2005 herauskam, begann dieses Verhalten aufgrund von Änderungen im Optimierungsprogramm, die dazu führten, dass verschiedene Pläne und Operatoren verwendet wurden, zu "brechen"TOP / ORDER BY
würde völlig ignoriert werden, wenn es wäreTOP 100 PERCENT
. Einige Kunden haben sich darüber so laut beschwert, dass Microsoft ein Ablaufverfolgungsflag ausgegeben hat, um das alte Verhalten wiederherzustellen. Ich werde Ihnen nicht sagen, was das Flag ist, weil ich nicht möchte, dass Sie es verwenden, und ich möchte sicherstellen, dass die Absicht richtig ist - wenn Sie eine vorhersehbare Sortierreihenfolge wünschen, verwenden SieORDER BY
für die äußere Abfrage.Um einen Punkt zusammenzufassen und zu verdeutlichen: Microsoft hat nichts entfernt . Sie machten das Produkt besser und als Nebeneffekt wurde dieses undokumentierte, nicht garantierte Verhalten weniger zuverlässig. Insgesamt finde ich das Produkt besser dafür.
quelle
TOP
Cursor eine Operation über der Ergebnismenge ausführt. Dafür kann es eine explizite Bestellung geben.TOP 100 PERCENT / ORDER BY
und vollständig aus dem Plan entfernt. Versuch es.Wenn eine Ansicht sortiert werden durfte, in welcher Reihenfolge sollte das Ergebnis hier sein?
quelle
Eine Möglichkeit besteht darin, widersprüchliche Sortierungen zu vermeiden. Wenn die Ansicht nach einer Reihenfolge sortiert wird und die Auswahl in dieser Ansicht nach einer anderen Reihenfolge sortiert wird (da die Ansichtssortierung nicht bekannt ist), kann dies zu Leistungseinbußen führen. Es ist also sicherer, die Sortieranforderung dem Benutzer zu überlassen.
Ein weiterer Grund ist, dass sort mit Performance-Kosten verbunden ist. Warum also alle Benutzer der Ansicht benachteiligen, wenn nur einige Benutzer die Sortierung benötigen?
quelle
ANSI SQL lässt die
ORDER BY
äußerste Abfrage aus verschiedenen Gründen nur zu. Eine davon ist, wenn eine Unterauswahl / Ansicht / CTE mit einer anderen Tabelle verknüpft wird und die äußere Abfrage eine eigeneORDER BY
hat.SQL Server hat es in einer Ansicht nie unterstützt (es sei denn, Sie haben es mit einem ausgetrickst,
TOP 100 PERCENT
der meiner Meinung nach meistens einen Fehler auslöst).Selbst wenn Sie den Fehler ausgelöst haben, waren die Ergebnisse nie zuverlässig, und die Sortierung verlief nicht immer so, wie Sie es erwartet hatten.
In diesem Blog-Beitrag des Query Optimizer-Teams finden Sie eine vollständige technische Erklärung. TOP 100 Prozent BESTELLUNG NACH Als schädlich eingestuft.
quelle
Views verhalten sich wie Tabellen, deren Inhalt durch die Ergebnisse einer Abfrage bestimmt wird.
Tische haben keine Ordnung; Es sind nur Säcke mit Reihen.
Daher haben Ansichten auch keine Reihenfolge. Sie können sie jedoch sortieren, indem Sie Zeilen in einer bestimmten Reihenfolge auswählen.
quelle
Eine noch nicht gegebene Antwort ist, dass "order by" das Prädikat-Pushing stören kann, was die Leistung stark beeinträchtigen kann.
Ein Beispiel ist eine Ansicht, die eine große Menge von Daten in einer 10-zeiligen Zusammenfassung zusammenfasst, die unter den Top 10 / Geordnet steht:
Für den gleichen Fall mit einem starken Prädikat:
Es dauert immer noch genauso lange, da das Prädikat durch top / order by daran gehindert wird, früher in der Pipeline ausgeführt zu werden. Dies kann dazu führen, dass nicht benötigte Zeilen verarbeitet werden, und der Plan ähnelt dem ohne Prädikat.
Ob der Push vor der Bestellung von passieren soll, ist wirklich eine Entwicklerentscheidung und kann die Antwort ändern. Am häufigsten ist der Push die logische Absicht.
Die logische Verwendung von "top 100 percent" ermöglicht das Pushen von Prädikaten, die Implementierung ignoriert jedoch in diesem Fall leider "order by" und besiegt die Absicht.
Für echte Anwendungsfälle wäre es ein guter Kompromiss, wenn der Motor "Order by Pulling" ausführt. Auf diese Weise kann in der Ansicht eine "Reihenfolge nach" angegeben werden (mit einem Top-100-Prozent-Wert oder ohne Top-Wert). Diese Reihenfolge wird nur verwendet, wenn die Ansicht direkt ausgewählt wird, ohne eine explizite Reihenfolge nach, ohne Joins, ohne Aggregate und ohne Ansichtsverkettung usw. Beide oben aufgeführten Fälle könnten von diesem einfachen Modell unterstützt werden.
quelle
Sie können eine Ansicht erstellen, die die Reihenfolge von hat und die Reihenfolge von beibehält, wenn sie abgefragt wird nach:
select top 99.999999999999 Prozent * from ..... order by
quelle
SELECT TOP 100 PERCENT ...
?