Autor Beitrag
mats74
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: Di 25.03.14 14:59 
Hallo zusammen

Ich habe folgendes Statement:
ausblenden 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

_________________
Gruss
mats74
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.)

Für diesen Beitrag haben gedankt: mats74
mats74 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189
Erhaltene Danke: 26

Win 10
VS 2017/19, C++, C#
BeitragVerfasst: 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 ...

_________________
Gruss
mats74