Wir müssen priority
einer Tabelle eine Spalte hinzufügen , die ungefähr 250 Mal pro Sekunde getroffen wird, ungefähr 170 Auswahlen, 125 Einfügungen und 60 Aktualisierungen. Die Spalte wird einfach sein number(1)
.
Dies priority
spielt keine Rolle für die Einfügungen oder Aktualisierungen, dh nicht Teil des Primärschlüssels, den ich separat erzwingen werde.
Grundsätzlich möchten wir nicht order by
170 Mal pro Sekunde einen Scan über einen Bereich durchführen müssen, da die ausgeführte Zahl massiv abfällt.
Gewährleistet eine indexorganisierte Tabelle , priority = 1
die beim Ausführen der folgenden Abfrage immer vorher kommt priority = 9
:
select *
from my_table
where rownum < 2
Für etwas mehr Kontext wäre eine typische Abfrage:
select *
from my_table
where mod(to_number(to_char(tstamp,'ss')),1) = 0
and done is null
and country = 'gbr'
and rownum < 2
Die pk-Einschränkung für das IOT würde priority, rest of the pk
mit einer separaten Einschränkung für das pk nur für die Struktur werden. done
ist in ungefähr 99% der Tabelle null, daher ist dies sowieso nicht sehr selektiv.
Ich denke, der Hauptindex ist, dass country, done, to_number(to_char(tstamp,'ss')
wir ungefähr 20 Kombinationen getestet haben, und dieser hat sich bei weitem durchgesetzt.
Ich bin überhaupt nicht bereit, diesen Abfragen eine Zeit hinzuzufügen. 0,01 pro Tag, der von select hinzugefügt wird, beträgt 41 Minuten pro Tag. Wir geben uns lieber mit "gut genug" als mit Perfektion zufrieden.
ORDER BY priority
(wie in Jacks Beispiel), werden IhreSELECT
Abfragen viel langsamer ausgeführt? Welche Indizes haben Sie auf dem Tisch?priority
, das IOT als führende Spalte hinzuzufügen ?Antworten:
Nein.
Das einzige , was die Garantien festgelegte Reihenfolge Ergebnis ist eine
ORDER BY
Klausel in der Abfrage.Dies ist eine beliebte Frage zu SQL. Es lohnt sich daher zu wiederholen, was ich als Antwort auf ähnliche Fragen zu SQL Server und MySQL geschrieben habe :
In Oracle minimiert eine indexorganisierte Tabelle (IOT) den Arbeitsaufwand, den die Datenbank leisten muss, um die Daten in der Sortierreihenfolge des Index zu sortieren. Obwohl Sie möglicherweise feststellen, dass Oracle dazu neigt, aus einem IOT ausgewählte Zeilen in derselben Reihenfolge zurückzugeben, wird Ihnen diese Reihenfolge nur garantiert , wenn Sie das IOT mit einer
ORDER BY
Klausel abfragen .quelle
ORDER SIBLINGS BY
kann eine Garantie über Ergebnis , um in einer hierarchischen Abfrage zur Verfügung stellen.Nein, Bestellung ist ohne nicht garantiert
ORDER BY
. Je.Aber so können Sie erreichen, was Sie wollen:
Dies führt nicht unbedingt dazu, dass Oracle mehr Arbeit leistet:
dbfiddle hier
Die Bedeutung von
COUNT STOPKEY
ist, dass Oracle nicht alle Zeilen von durchlaufen mussFULL SCAN
quelle
Nein. Die einzige Möglichkeit, die Reihenfolge der Ergebnisse zu gewährleisten, besteht darin, eine hinzuzufügen
ORDER BY
.quelle
Für Microsoft SQL Server lautet die Antwort ebenfalls Nein, und die Mechanik ist ziemlich interessant. Auf der Seite "Online-Bücher" zum Scannen wird das Konzept der Karussellscans im Abschnitt "Erweitertes Scannen" erläutert:
Weitere Informationen finden Sie auf der Seite "Bücher online" .
quelle