Standard-Reihenfolge in der SELECT-Abfrage - SQL Server 2008 vs SQL 2012
Unser team vor kurzem die Aktualisierung unserer Datenbanken von SQL Server 2008 auf SQL Server 2012. Eine wichtige änderung, die wir bemerkten, war in der Standard-Reihenfolge der zurückgegebenen Zeilen von der SELECT-Anweisung, d.h., wenn eine explizite ORDER BY-Klausel nicht angegeben ist.
Als pro MSDN, SQL Server 2012 keine Garantie die Reihenfolge der Zeilen zurückgegeben, es sei denn, eine ORDER BY-Klausel angegeben ist.
Wir haben 2500+ gespeicherte Prozeduren auf 5 Datenbanken, die über eine SELECT-Anweisungen ohne ORDER BY-Klausel und es wird eine beträchtliche Anstrengung, um das hinzufügen der ORDER BY-Klausel manuell mit dem Verhalten in SQL Server 2008. Gibt es eine Einstellung oder ein schneller Weg, dies zu tun?
Die andere option, die noch nicht erforscht ist, ist das downgrade auf SQL Server 2008. Wie schwierig wäre diese?
order by
das DBMS ist frei, kehren Sie in irgendeinem, um es zu passen scheint. Ihr code gebrochen wurde, von Anfang an. Die einzig sinnvolle Lösung, um Ihr problem zu beißen die Kugel und ändern den code ein order by
Man Glück hat dieser Fehler noch nicht gezeigt, schon früher.Auch SQL 2008 ist das gleiche, dass es garantiert kein "default" - Zeile der Bestellung
Versuchen Sie es mit clustured und nicht-clustured index, wenn Sie bereits ein primary key in Ihrer Tabelle, die Sie nicht haben, um über sorgen clustured als standardmäßig primary key ist clustured index.
ORDER BY
sollte nur relevant sein, in SELECT
Abfragen. (es sei denn, Sie tun wirklich dumme Dinge wie LIMIT 1
in Unterabfragen oder ausbrechen der cursor-loops)Warum ist der Einsatz von
LIMIT
eine dumme Sache, @joop?InformationsquelleAutor Channs | 2014-10-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie gehen Sie zurück und fügen Sie
ORDER BY
Klauseln, um Ihren code, weil ohne Sie der Auftrag ist nie garantiert. Sie waren die "glücklichen" in der Vergangenheit, dass Sie immer das gleiche bestellen, aber es war nicht, weil SQL Server 2008 garantiert es trotzdem. Es vermutlich zu tun hatte mit Ihren Indizes oder, wie die Daten gespeichert auf der Festplatte.Wenn Sie umgezogen auf einen neuen host, wenn Sie ein Upgrade der Unterschied in der hardware-Konfiguration allein könnte sich geändert haben die Möglichkeit, Ihre Abfragen ausführen. Nicht zu schweigen von der Tatsache, dass der neue server hätte neu berechnet Statistiken für die Tabellen und die SQL-Server-2012-Abfrageoptimierer wahrscheinlich Dinge ein wenig anders als die, die in SQL Server 2008.
Es ist ein Trugschluss, dass Sie sich verlassen können auf die Bestellung eines ResultSet in SQL ohne explizite Angabe der Reihenfolge, die Sie wollen es in. SQL-Ergebnisse NIE haben einen Auftrag, den Sie sich verlassen können, ohne eine
ORDER BY
- Klausel. SQL basiert auf der Mengenlehre. Abfrage-Ergebnisse sind im Grunde legt (oder mehreren Sätzen).Itzik Ben-Gan gibt eine gute Beschreibung des set-Theorie in Bezug zu SQL in seinem Buch Microsoft SQL Server 2012 T-SQL-Grundlagen
Nach einer gründlichen Erläuterung der Begriffe in der definition Itzik geht dann auf zu sagen:
Aber unabhängig von der akademischen definition eines Satzes auch die Umsetzung in der SQL-server ist nie garantiert werden, um in den Ergebnissen. Diese MSDN-blog-Beitrag von 2005 von einem Mitglied der Abfrage-Optimierer-team besagt, dass Sie sollten sich nicht auf die Reihenfolge von zwischen-Operationen überhaupt.
Diesem blog-post von Conor Cunningham (Architekt, SQL-Server-Core-Engine) "Kein Sicherheitsgurt - in der Erwartung Um, ohne, UM, DURCH" ist zu SQL Server 2008. Er hat eine Tabelle mit 20k Zeilen mit einem einzigen index, der scheinbar immer wieder Zeilen in der gleichen Reihenfolge. Hinzufügen eines
ORDER BY
auf die Abfrage gar nicht ändern, die Ausführung zu planen, so dass es nicht wie das hinzufügen in die Abfrage teurer, wenn der Optimierer erkennt es nicht es brauchen. Aber sobald er fügt eine weitere 20k Zeilen der Tabelle plötzlich die Abfrage-plan-änderungen und jetzt ist es verwendet, Parallelität und die Ergebnisse sind nicht mehr bestellbar!Wenn Sie brauchen mehr überzeugend, nur Lesen Sie diese Beiträge:
ORDER BY
- Klausel nicht auf die Leistung auswirken, wenn der Abfrageoptimierer erkennt, dass es gar nicht brauche. Lohnt es sich, mit der Gefahr, dass sich die Dinge unerwartet brechen, nur weil Sie nicht das Gefühl, wie wenn man eineORDER BY
auf deine Anfrage?Ich weiß nicht, welche Bedeutung sehen Sie in der Tatsache, dass Ihre einfache Abfrage mit einer Tabelle der index gibt die Zeilen zurück, in der Reihenfolge, die Sie erwarten. Nein, wo habe ich gesagt, dass es nie kommen in der Reihenfolge, die Sie erwarten. Lesen Sie im letzten Zitat in meiner Antwort von einem der SQL-Server-Architekten. Ohne die
ORDER BY
Klausel, die die Reihenfolge des Resultsets können sich jederzeit ändern, für so viele Gründe, dass man nicht wissen kann, Wann es geschehen wird. Was Sie sagen, ist schlecht beraten und sollte nicht verwendet werden, es ist in einem Produktivsystem. Verlassen Sie sich nicht auf Indizes, die für die Bestellung. Wenn Sie brauchen eine geordnete Ergebnismenge verwenden Sie einORDER BY
Es ist eine Tatsache, dass Ihr nicht garantieren kann, Sortierreihenfolge ohne Angabe einer ORDER BY-Klausel. Auch wenn es passiert zu 99,99% der Zeit, das ist nicht 100%, es ist einfach nur Glück, und eine vereinfachte test-Fall. Bitte ändern Sie Ihren Kommentar. Es ist sehr wichtig, dass andere Menschen Lesen diese Antwort verstehen, wenn Sie verlassen sich auf die Sortierreihenfolge, dann sollten Sie explizit um Ihre Ergebnisse. Es ist nicht "die Arbeit in der SQL-2016". Es funktioniert nicht in jeder edition, es ist völlig bis zu der Abfrage-engine zu entscheiden, um dass Ergebnisse zurückgegeben werden, es sei denn, Sie BESTELLEN. Deine Kommentare hier werden nur die Leute verwirren.
Entfernt meine Kommentare. Order by-Klausel ist ein muss für 100% Genauigkeit.
InformationsquelleAutor Mike D.