Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Select Anweisung falsche Reihenfolge


mats74 - Di 25.03.14 14:59
Titel: Select Anweisung falsche Reihenfolge
Hallo zusammen

Ich habe folgendes Statement:

SQL-Anweisung
1:
Select * from MEINE_TABELLE where MEINE_TABELLE_SPALTE_2 = 1                    

Die Tabelle wird nach PrimaryKey asc (MEINE_TABELLE_SPALTE_1) per default sortiert.
Dieses Statement findet ca. 150 Datensätze und gibt sie im Ergebnisfenster des Management Studios aus.

Mein Problem:
- Bei erneutem Ausführen des Statements werden die Datensätze unterschliedlich in der Reihenfolge ausgegeben.
- Die Darstellungsreihenfolge hat keine logische Abfolge und ändert sich stetig.
- Diese Reihenfolge wird logischer Weise auch in meinem Programm falsch interpretiert.

Die festgelegte Reihenfolge auf der Tabelle nach PrimaryKey wird also nicht berücksichtigt.
Ich möchte nicht die order by Klausel am Statement anhängen, sondern diesen "Fehler" verstehen.

Wie kann dieser Umstand erklärt werden?
Wo kann das Problem liegen?

Vielen Dank für eure Hilfe

Moderiert von user profile iconTh69: SQL-Tags hinzugefügt


Ralf Jansen - Di 25.03.14 16:04

Zitat:
Ich möchte nicht die order by Klausel am Statement anhängen, sondern diesen "Fehler" verstehen.

Es ist kein Fehler. Datenbanken dürfen den für sie schnellstmöglichen Weg benutzen um Daten zu liefern wenn man keine explizite Reihenfolge angibt. Es darf sich sogar die Reihenfolge bei wiederholtem Aufruf ändern wenn es so dann schneller geht z.B. weil später ein Teil aus Caches, Buffern etc. kommt und nicht mehr vom Datenträger oder ein Reorganisation der Datenstruktur stattgefunden hat(Sweeping, Garbage Collection etc.)
Du solltest immer davon ausgehen das ein SQL keine spezielle Reihenfolge hat außer du gibts sie explizit an.

Zitat:
Die Tabelle wird nach PrimaryKey asc (MEINE_TABELLE_SPALTE_1) per default sortiert.


Wodurch sollte das gewährleistet sein? Wenn kein Index zieht wird vermutlich nach der physischen Reihenfolge auf dem Datenträger vorgegangen. Bei den meisten Datenbanken entspricht diese Sortierung dem PK (zumindest im Defaultfall). Das ist aber hier maximal eine Vermutung bezüglich eines Implementierungsdetails. Bei der konkreten Datenbank könnte ein anderes Vorgehen schneller sein. Oder es gibt Indizes die ziehen die eine andere Reihenfolge erzwingen (z.b. der auf MEINE_TABELLE_SPALTE_2 wenn es da einen gibt.)


mats74 - Di 25.03.14 16:47

Hallo Ralf

Vielen Dank für Deine schnelle Antwort .
Deine Ausführungen erklären eigentlich alles.

Die betroffene Tabelle enthält ca 45000 Zeilen und die Zugriffstatements habe ich vor 3 Wochen anpassen müssen.
Nach diesem Update sind die Daten in anderer Reihenfolge interpretiert worden und folglich zu fehlerhaften Speichervorgängen mutiert :P .
Dies wurde auf 2 Servern SQL 2005 in der gleichen Zeit ausgelöst.
Beim SQLExpress ist dieses Verhalten bei gleichem Dateninhalt (noch) nicht aufgetreten.
Liegt wahrscheinlich daran, dass SQLExpress andere Optimierungsmuster beinhaltet.

Die Lösung liegt also auf der Hand:
- Explizite Angabe der Sortierreihenfolge bei Select-Statements durch die OrderBy-Klausel

Ich werde die Statements entsprechend anpassen.
Der Tag ist ja noch jung ...