[Oracle] Performance Abfrage Datumsbereich

m3000

Erfahrenes Mitglied
Hallo,

in meiner Tabelle habe ich die Spalte "opendate", definiert als NUMBER. Nun will ich alle Datensätze zählen, die im Jahre 2005 angelegt wurden (plus weitere Bedingungen). Welche der folgenden Varianten kann die Maschine schneller ausrechnen:
Code:
where opendate between '20050101' and '20051231'
oder
Code:
where substr(opendate,1,4) = '2005'
Mein erster Eindruck ist, dass die between-Abfrage schneller läuft, aber das kann auch immer an der aktuellen Systembelastung liegen. Für künftige komplexere Abfrage würde ich mich freuen, wenn ich diese Art statement möglichst performant formuliere.

Vielen Dank und Gruss
m3000
 
Danke Tom,

ich habe alle Varianten je zweimal gemessen, um Abweichungen wegen Systembelastung ein wenig zu realisieren. Das Ranking:

1. between: ~00:00:56.00
2. substr: ~00:01:06.00
3. /10000: ~00:01:20.00
4. to_char : ~00:01:39.00


Bei meiner kleinen Test-Abfrage sind die Unterschiede gering. Aber ich hätte gern das theoretische Wissen, welche Variante am ehesten der Systemintelligenz entspricht. In komplexen Abfragen mit joins usw. kann das schon grössere Abweichungen bedeuten.


Dank und Gruss
Marcus
 
Hallo!

Wenn du wirklich wissen willst, was die Datenbank aus deinem Statement macht, solltest du dir den executen Plan anzeigen lassen...
explain plan for select...

Gruss Tom
 
Bei meiner kleinen Test-Abfrage sind die Unterschiede gering. ...
Es zeigt sich aber doch deutlich, dass die Verwendung von Funktionen oder Umrechnungen zusätzlich Zeit kosten. Bei between werden nur einfache < bzw. > Vergleiche ausgeführt.
Du könntest evtl. die Hochkommas in der between-Klausel weglassen, da der Datentyp = Number ist, ob das noch ein paar Sekunden bringt, weiß ich aber auch nicht.

Wenn diese Abfrage häufig durchgeführt wird, kann die richtige Indizierung geschwindigkeitsbestimmend sein. Für
where substr(opendate,1,4) ...
wäre dann z.B. ein funktionsbasierender Index einzusetzen.
Code:
 CREATE INDEX ix_meinindex ON  tbl_meinetab(SUBSTR(opendate,1,4) )
 
Mal davon abgesehen, daß Deine Lösung halt auch eine ist...warum nimmst Du nicht DATE oder TIMESTAMP? Damit kann man "rechnen" (z.B.: alles von heute und der letzten Wochen, etc.), es ist der "natürliche" Weg solche Werte zu speichern und man kann prinzipiell alles damit machen, was meine Vorredner vorgeschlagen haben.
 
Hallo,

ishino hat gesagt.:
...warum nimmst Du nicht DATE oder TIMESTAMP?
Die Datenstruktur definiere nicht ich, es ist eine gekaufte Anwendung. Aber Du hast Recht, diese Frage bzw. Beschwerde ist im Anwenderkreis schon häufig aufgetaucht.


Tom hat gesagt.:
Wenn du wirklich wissen willst, was die Datenbank aus deinem Statement macht, solltest du dir den executen Plan anzeigen lassen...
Tja, die Anleitungen von Exceptionfault habe ich mir vor einer Weile mal ausgedruckt, angesehen und wieder weggelegt. Ich verstehe nur Bahnhof. Klar, wenn ich das dringend bräuchte, müsste ich die Zeit zum Durcharbeiten aufwenden. Aber hier hatte ich einfach gehofft, dass jemand so eine Art Rangliste nennen kann, welche Funktionen einer DB leichter fallen und welche mehr Rechenkapazität brauchen. - So in der Art: "Interview mit Beckenbauer? Plan 30 Minuten ein. Wenn es kürzer sein soll, nimm Zwanziger" ;)

Danke an alle, Gruss
Marcus
 

Neue Beiträge

Zurück