Ordnet DB2 Daten nach dem Primärschlüssel

8

Ich habe kürzlich eine Diskussion mit einem Kollegen geführt, der darauf drängte, die Reihenfolge nach Klauseln aus einer Produktionsabfrage zu entfernen, da die Reihenfolge nach Spalte mit dem Primärschlüssel identisch war .

Nach einer langen Diskussion, in der ich zu erklären versuchte, dass er die Bestellung anhand des Primärschlüssels nicht garantieren kann, war die endgültige Schlussfolgerung, dass er nicht darauf drängen würde, die MSSQL-Abfragen zu ändern.
Aber er würde immer noch die DB2-Abfragen ändern.

Ich konnte nicht sofort einen Artikel finden, der widerlegt, dass DB2 Abfragen nach dem Primärschlüssel ordnet, und frage mich derzeit, ob dies der Fall ist oder nicht.

Meine Frage ist also, wie ordnet DB2 eine Abfrage an, wenn es keine order by-Klausel gibt. Verwendet es den Primärschlüssel?
Wie können Sie sicherstellen, dass Daten in einem parallelen System ohne Bestellung per Klausel korrekt bestellt werden?

Reagiert
quelle

Antworten:

18

Nein, Ihr Kollege liegt falsch.

Alle SQL-Produkte - DBMS, die sich gemäß den SQL-Standards verhalten - bieten keine Garantie dafür, dass das Ergebnis einer Abfrageausgabe in irgendeiner Weise sortiert wird, es sei denn, ORDER BYdie Abfrage enthält eine Klausel .

In den IBM DB2-Dokumenten wird Folgendes erwähnt :

Die Bestellung erfolgt gemäß den unter Sprachelemente beschriebenen Vergleichsregeln. Der Nullwert ist höher als alle anderen Werte. Wenn Ihre Bestellspezifikation keine vollständige Reihenfolge festlegt, haben Zeilen mit doppelten Werten des zuletzt identifizierten Sortierschlüssels eine beliebige Reihenfolge. Wenn Sie nichts angeben ORDER BY, haben die Zeilen der Ergebnistabelle eine beliebige Reihenfolge.

ypercubeᵀᴹ
quelle
"Wenn sie sich nach SQL-Standards verhalten" ist ein großes Problem, wenn ... IBM Dokumente FTW.
WernerCD
@WernerCD Kein DBMS entspricht zu 100% dem Standard (und es gibt viele Versionen davon). Sie behaupten jedoch, viele Teile zu erfüllen. Ich erwarte zumindest, wo sie sich unterscheiden, dokumentiert.
Ypercubeᵀᴹ
Ja, deshalb war ich +1 für IBM-Dokumente über "Standards". "Erwartet" gegen "Tatsächlich" kann und wird Sie auf jeden Fall in den Keister beißen.
WernerCD
11

Wie in der Antwort von ypercube ausgeführt, gibt es keine definierte Reihenfolge , wenn es keine ORDER BYKlausel gibt .

Was ich hinzufügen möchte, ist, dass es wichtig ist zu erkennen, dass SQL eine Abstraktion ist. Es gibt nicht Schritt für Schritt an, was das DBMS tun soll, sondern spezifiziert Ihre Anforderungen an das Endergebnis.

Dies bedeutet, dass, wenn die Daten bereits so nachgeschlagen werden, dass die richtige Reihenfolge gewährleistet ist, dies darauf zurückzuführen ist, dass das DBMS eine solche Strategie beschlossen hat und dann bereits weiß, dass keine zusätzlichen Sortierarbeiten erforderlich sind, um die Anforderungen der ORDER BYKlausel zu erfüllen .

Wenn Sie jedoch nicht angeben, dass die Reihenfolge für Sie von Bedeutung ist (obwohl dies tatsächlich der Fall ist?), Berücksichtigt das DBMS dies und findet eine andere Strategie, mit der die richtigen Daten effizienter gefunden werden können Bei einer anderen Bestellung wird die Tatsache ausgenutzt, dass Sie sich anscheinend nicht um die Bestellung gekümmert haben. (Die gewählte Strategie könnte sich auch im Laufe der Zeit ändern, basierend auf der zunehmenden Datenmenge in den relevanten Tabellen, Software-Patches usw.)

Das heißt, das Entfernen der ORDER BYKlausel hat nur einen sehr geringen Vorteil (etwas kleinere Abfragegröße), aber möglicherweise einen großen Nachteil, wenn die Reihenfolge tatsächlich wichtig ist. Zumal dies sehr gut mit dem Testdatensatz funktionieren und durch Akzeptanztests kommen könnte, um später ernsthafte Probleme zu verursachen.

Håkan Lindqvist
quelle
1
Der Grund, den er auf seinem Bereitstellungsblatt angegeben hat, ist, dass "Die Bestellung nach CPU-Ressourcen beansprucht, während die Bestellung bereits vom Primärschlüssel impliziert wird". Was für mich sehr falsch klang (wie die bisherigen Antworten belegen)
Reaces
@Reaces verwendet DB2 standardmäßig 'Heap'-Tabellen oder ähnelt es eher SQL Server mit Clustered-Indizes? Es ändert nichts an der Antwort, aber es kann es einfacher machen zu beweisen :)
Jack sagt, versuchen Sie es mit topanswers.xyz
@ Jack Douglas, Clustering in SQL Server und DB2 sind unterschiedliche Konzepte. In diesem Thread habe ich viel über das Clustering in SQL Server gelernt: groups.google.com/d/msg/comp.databases.ms-sqlserver/P7Wcs4NcF4s/… . Wenn Sie mit SQL Server vertraut sind, aber nicht mit DB2, möchten Sie vielleicht einen Blick darauf werfen.
Lennart
@ Reseaces-Tabellen in DB2 werden normalerweise standardmäßig auf dem Primärschlüssel "geclustert", sofern kein Clustering-Index angegeben ist.
Chris Aldrich
1
@ChrisAldrich - Diese Aussage gilt nur für DB2 unter z / OS.
Mustaccio