Dies ist eine statische Kopie unseres alten Forums. Es sind keine Interaktionen möglich.
This is a static copy of our old forum. Interactions are not possible.

Sinan

Senior Schreiberling

  • "Sinan" is male
  • "Sinan" started this thread

Posts: 1,021

Date of registration: Jul 5th 2003

Location: Malaga

Occupation: Senior Cloud Solution Engineer bei Oracle

1

Tuesday, August 22nd 2006, 8:23am

SQL & Spaß

Guten Morgen zusammen,

In Anlehnung an "Java & Spaß" hier mal ein Thread für SQL und Spaß.
Es soll hauptsächlich darum gehen, Tipps und Tricks zur Optimierung der SQL-Abfragen (gernigere Antwortzeiten) zu geben und zu diskutieren.

Ich wußta gar nicht, dass wenn man mit einer indizierten Spalte Berechnungen durchführt, der Index umgehen wird und ein Full-Table-Scan durchgeführt wird. also bei

Source code

1
2
3
SELECT * 
FROM customer
WHERE total_purchases/10 > 1000;

wird ein Full-Table-Scan durchgrführt obwohl die Spalte total_purchases indiziert ist.
Das kann man umgehen indem man die WHERE-Klausel in

Source code

1
WHERE total_purchases > 1000*10;

umschreibt.

Ich habe beide Anfragen durchgefüht, Tabelle mit 50 Datensätzen, die Antwortzeit war aber in beiden Fällen 20 ms.
Ich vermutte der Unterschied macht sich erst bei Tabellen mit mehreren Tausend oder Millionen Datensätzen bemerkbar.

Achso, verwendet man Funktionen wie substr, lower oder uper, so wird der Index ebenso ungültig.

Man kann den Trick in die andere Richtung verwenden:
Weiß man das eine Anfrage mehr als 20 Prozent der Datensätz zurückliefern würde und deshalb ein Full-Table-Scan schneller sein würde, so kann man bewußt den Index umgehen indem man einfach 0 zur entsprechenden Spalte addiert

Source code

1
WHERE total_purchases+0 = 1000


Auch z.B. die Verwendung von Datentypen, UNION anstatt OR oder die Reihenfolge der Spalten in der WHERE-Klausel kann Einfluss auf die Performance haben.
Also wer dran Spaß hat kann gern hier reinposten. Auch Empfehlungen von Büchern oder Internet-Seiten die sich damit Beschäftigen wären super. Bin mal sehr gespannt auf eure Super-Tricks :)
With great power comes great responsibility

  • "Joachim" is male

Posts: 2,863

Date of registration: Dec 11th 2001

Location: Hämelerwald

Occupation: Wissenschaftlicher Mitarbeiter (Forschungszentrum L3S, TU Braunschweig)

2

Tuesday, August 22nd 2006, 9:10am

RE: SQL & Spaß

Quoted

Original von Sinan
Achso, verwendet man Funktionen wie substr, lower oder uper, so wird der Index ebenso ungültig.
Das finde ich nicht verwunderlich. Der Index bezieht sich auf die in der Datenbank enthaltenen Werte, und ist daher für die Suche nach davon abgeleiteten Werten in der Regel nicht verwendbar.

Quoted

Man kann den Trick in die andere Richtung verwenden:
Weiß man das eine Anfrage mehr als 20 Prozent der Datensätz zurückliefern würde und deshalb ein Full-Table-Scan schneller sein würde, so kann man bewußt den Index umgehen indem man einfach 0 zur entsprechenden Spalte addiert

Source code

1
WHERE total_purchases+0 = 1000
Lieber nicht. Optimierungen sollte man meiner Meinung nach dem Optimierer überlassen. Und wenn man einen Full Table Scan möchte, sollte man ihm das auch direkt sagen. In Oracle geht das irgendwie.

Zudem tritt es vermutlich eher selten auf, daß eine Anfrage mehr als 20 % der Datenbank zurückliefert und dies auch gewollt ist. Bei Datenmengen, bei denen ein Full Table Scan tatsächlich viel schneller wäre, ist mit dem Ergebnis einer solchen Anfrage aufgrund seiner Größe ohnehin nicht viel anzufangen.
The purpose of computing is insight, not numbers.
Richard Hamming, 1962

This post has been edited 4 times, last edit by "Joachim" (Aug 22nd 2006, 9:51am)