Warum fügt SSMS neue Zeilen oben in eine Tabelle ein, nicht unten?


9

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 das 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 sie order by , 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?

  0

Wie ich manchmal gesehen habe, hängt es von der Reihenfolge der PK ab, wie die Zeilen angezeigt werden, wenn Sie eine einzelne Tabelle auswählen.Wenn Sie einige Verknüpfungen vornehmen, kann sich dies in Abhängigkeit von den anderen Tabellen PK, FK und Indizes ändern. 18 jul. 132013-07-18 22:00:36

  0

Beachten Sie auch die [Karussell] -Scans (http://technet.microsoft.com/en-us/library/ms191475%28v=sql.105%29.aspx). 01 apr. 152015-04-01 03:49:03

17

In der SQL-Welt ist die Reihenfolge keine inhärente Eigenschaft einer Datenmenge.Daher erhalten Sie von Ihrem RDBMS keine Garantie, dass Ihre Daten in einer bestimmten Reihenfolge - oder sogar in einer konsistenten Reihenfolge - zurückkehren, es sei denn, Sie fragen Ihre Daten mit einem abORDER BYKlausel.

VonCraig Freedman:

Die Kombination von TOP mit ORDER BY fügt der Menge der zurückgegebenen Zeilen Determinismus hinzu.Ohne ORDER BY hängt die Menge der zurückgegebenen Zeilen vom Abfrageplan ab und kann sogar von Ausführung zu Ausführung variieren.

Verwenden Sie immerORDER BYwenn 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.


0

Dies liegt daran, dass die Tabelle (höchstwahrscheinlich) eine Heap-Tabelle ist und nicht indiziert ist.Machen Sie die ID-Spalte PRIMARY KEY sowie IDENTITY .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 eine ORDER 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.

  0

Gut zu wissen.Ich wusste, dass dies ein Hinweis war, die App so zu ändern, dass sie "Sortieren nach" verwendet (es ist eine geerbte App mit vielen schlechten Praktiken), aber ich habe mich genau gefragt, warum es passiert ist. 14 sep. 112011-09-14 19:49:38

+4

Ändern Sie die Struktur der Tabelle so, dass SELECT ohne ORDER BY in der richtigen Reihenfolge wieder angezeigt wird (aber immer noch nicht garantiert ist). 14 sep. 112011-09-14 20:22:26

  0

Bei einem einfachen SELECT aus der Tabelle mit einem Clustered-Index würde dies in der Reihenfolge des Clustered-Index erfolgen.War nicht so klar, wie ich hätte sein sollen, dass es sich um ein Beispiel dafür handelt, wann Daten physisch nach einer bestimmten Spalte geordnet sind, aber es ist definitiv nicht selbstverständlich, dass sie in jeder Abfrage korrekt zurückgegeben werden.Mea culpa. 14 sep. 112011-09-14 20:27:39

+4

Es spielt keine Rolle, wie der Clustered-Index lautet.SQL Server gibt möglicherweise die Reihenfolge basierend auf einem anderen Index zurück, der auf einer Vielzahl von Faktoren basiert.Erstellen eines Primärschlüssels für eine Spalte *** DOES NOT *** garantiert, dass bei Auswahl ohne Reihenfolge von plötzlich immer die Reihenfolge dieser Spalte wiederhergestellt wird.Könnten Sie das die meiste Zeit beobachten?Sicher.Dies ist jedoch nicht gleichbedeutend mit einer Garantie.Ich habe noch nie einen Eisbären auf meiner Straße gesehen, aber es gibt kein Eisbär-Kraftfeld, das dies verhindert. 14 sep. 112011-09-14 20:41:09

+3

Mein Punkt war jedenfalls, dass das Hinzufügen einer "ORDER BY" -Klausel eine viel bessere Garantie ist (egal, viel weniger störend), als Schemaänderungen an der Tabelle vorzunehmen und zu hoffen, dass die Reihenfolge für immer so bleibt, wie Sie es erwarten. 14 sep. 112011-09-14 20:42:25


10

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:

Wenn Sie sich auf die Reihenfolge einer Abfrage verlassen möchten, fügen Sie IMMER hinzuORDER BY .

  0

Ich hatte nicht vor, je nach Bestellung, aber optisch ist es etwas ärgerlich, dass meine zuletzt eingefügten Artikel plötzlich oben sind. 14 sep. 112011-09-14 20:18:15

  0

Ich nehme an, das liegt daran, dass Sie Open Table verwenden.In Management Studio 2008 wurde dieser Befehl in "Edit Top n Rows" und "Select Top N Rows" aufgeteilt. Wenn Sie letztere auswählen, können Sie die resultierende Abfrage bearbeiten, z. B. die oberste entfernen und eine Bestellung hinzufügen, indem Sie. 14 sep. 112011-09-14 20:21:07

  0

Es ist Management Studio 2008, der Server ist 2005, sollte klarer sein.Ich wusste nicht, dass es einen "open table" -Befehl gibt, ich habe immer die "select" -Anweisungen verwendet 14 sep. 112011-09-14 20:36:30

+4

Ok, Punkt steht noch, ich verstehe, dass es ärgerlich ist, dass die Daten in einer Reihenfolge zurückkommen, die Sie nicht erwarten, aber ich hoffe, es ist jetzt klar, warum SQL Server es nicht wirklich interessiert, welche Reihenfolge Sie erwarten, * es sei denn * Sie sagen es Sie kümmern sich, indem Sie eine Order by-Klausel hinzufügen.:-) 14 sep. 112011-09-14 20:37:35