Immer wenn ich in SQL Server Management Studio 2008 eine Zeile manuell in eine Tabelle einfüge (die Datenbank ist SQL Server 2005), wird meine neue Zeile oben in der Liste und nicht unten angezeigt. Ich verwende Identitätsspalten und dies führt zu Dingen wie
id row
42 first row
1 second row
2 third row
Wenn Zeilen abgerufen und nicht explizit geordnet werden. Dies führt zu einer anderen Darstellung, wenn die Zeilen für die Webanwendung abgerufen werden, und ändert, was eine TOP 1
Abfrage zurückgibt.
Ich weiß, ich kann order by
sie, aber warum passiert das? Die meisten meiner Daten werden über eine Webanwendung eingefügt. Alle Einfügungen aus dieser Anwendung führen zu einer First-In-First-Out-Bestellung, z. Befindet sich auf dem Server oder im Management Studio eine Einstellung, die diese falsche Reihenfolge verursacht?
quelle
Antworten:
In der SQL-Welt ist die Reihenfolge keine inhärente Eigenschaft einer Datenmenge. Daher erhalten Sie von Ihrem RDBMS keine Garantie dafür, dass Ihre Daten in einer bestimmten Reihenfolge - oder sogar in einer konsistenten Reihenfolge - zurückkehren, es sei denn, Sie fragen Ihre Daten mit einer
ORDER BY
Klausel ab.Von Craig Freedman :
Verwenden
ORDER BY
Sie diese Option immer, wenn Sie eine klar definierte und konsistente Reihenfolge in Ihrer Ergebnismenge erwarten. Verlassen Sie sich niemals darauf, wie Ihre Datenbank die Zeilen auf der Festplatte speichert (z. B. über einen Clustered-Index), um eine bestimmte Reihenfolge der Daten in Ihren Abfragen zu gewährleisten.quelle
Nur um die anderen Antworten zu ergänzen: Eine Tabelle ist per Definition eine ungeordnete Menge von Zeilen. Wenn Sie keine
ORDER BY
Klausel angeben , kann SQL Server die Zeilen in der Reihenfolge zurückgeben, die er für am effizientesten hält. Dies fällt häufig nur mit der Reihenfolge des Einfügens zusammen, da die meisten Tabellen einen Clustered-Index für Identität, Datum und Uhrzeit oder andere monoton ansteigende Spalten aufweisen. Sie sollten dies jedoch genau so behandeln: ein Zufall. Es kann sich mit neuen Daten, einer Statistikaktualisierung, einem Ablaufverfolgungsflag, Änderungen an maxdop, Abfragehinweisen, Änderungen an der Verknüpfung oder Where-Klauseln in der Abfrage, Änderungen am Optimierer aufgrund eines Service Packs / kumulativen Updates / Hotfixes / Upgrades ändern. Verschieben der Datenbank auf einen anderen Server usw. usw.Mit anderen Worten, und ich weiß, dass Sie die Antwort bereits kennen, aber es kann nicht genug gesagt werden:
quelle
select
Anweisungen verwendetDies liegt daran, dass die Tabelle (höchstwahrscheinlich) eine Heap-Tabelle ist und nicht indiziert ist. Machen Sie die ID-Spalte a
PRIMARY KEY
sowieIDENTITY
. SQL Server speichert die Daten physisch basierend auf den Indizes. Wenn id beispielsweise ein Clustered-Index (wie ein Primärschlüssel) wäre, würden die Daten physisch in der Reihenfolge der IDs gespeichert und auf diese Weise auch ohne eine Abfrage zurückgegeben eineORDER BY
Klausel. Andernfalls ist die Reihenfolge der Zeilen für die Datenbank überhaupt nicht wichtig. Folglich ist es keine gute Praxis , eine Anwendung von der Reihenfolge der Zeilen in der Datenbank abhängig zu machen (und auch davon, ob sich die Spalten in einer bestimmten Reihenfolge befinden). Die Anwendung muss mit allen Schlüsseln arbeiten, die sich in der Datenbank befinden, um Zeilen zu identifizieren.quelle
order by
(es ist eine vererbte App mit vielen schlechten Praktiken), aber ich habe mich genau gefragt, warum dies passiert ist.SELECT *
ohneORDER BY
vielleicht wieder in der „richtigen“ Reihenfolge (aber noch nicht garantiert werden)?ORDER BY
Klausel eine viel bessere Garantie ist (egal, dass es weniger störend ist), als Schemaänderungen an der Tabelle vorzunehmen und zu hoffen, dass die Reihenfolge für immer so ist, wie Sie es erwarten.