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
Th69: 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.)