title image


Smiley Antwort zu 2. (nicht benötigte Tabellen im FROM)
2)Was passiert bei einer Abfrage die ungefähr so aussieht?:

SELECT a1.ID FROM a1, b2, c3, d4 WHERE a1.ID = 1;

Ich weiß, die Abfrage macht so keinen Sinn aber da mein SQL-Statement dynamisch

ist, kam es manchmal vor, das Tabellen in der FROM-Anweisung standen, die nicht

benötigt wurden. Das Ergebnis war, das die Performance gnadenlos in den Keller

gegangen ist aber wieso? Die Tabellen werden ja gar nicht benötigt?

Liest mysql die trotzdem ein?



Nicht benötigte und nicht gejointe (egal ob über WHERE oder JOIN) Tabellen im FROM sind so ziemlich das übelste, was dir performancemässig passieren kann. Jedes Datenbanksystem geht nämlich davon aus, dass du weisst, was du tust.

Wenn du also Tabellen im FROM angibst, dann werden die auch dazugeschlüsselt. Wenn dann keine Join-Bedingung da ist, heisst diese implizit eben: verknüpfe jeden Satz der einen Tabelle mit jedem Satz der anderen. Bei noch mehr Tabellen potenziert sich das.



Beispiel: Tabelle A1 hat 10 Sätze, Tabelle B2 hat 20 und Tabelle C3 hat 30, Tabelle D4 40.

Jetzt mache ich deinen obigen Select (fett). Was macht das System:

1. Es holt sich den einen Datensatz aus a1 mit id=1. [1 Datensatz, vermutlich Indexzugriff]

2. Dazu schlüsselt es jetzt alle Datensätze aus B2. [20x1 = 20 Datensätze, Full Table Scan]

3. Dazu schlüsselt es jetzt alle Datensätze aus C3. [30x20 = 600 Datensätze, Full Table Scan]

4. Dazu schlüsselt es jetzt alle Datensätze aus D4. [40x600 = 24000 Datensätze, Full Table Scan]



Jetzt gibt es dir 24.000 mal "1" aus.



Hier wundern sich viele Entwickler: Komisch, sollte doch nur einmal rauskommen!

Und dann greifen sie zum Vorschlaghammer und ändern ihr Statement ab:

SELECT DISTINCT a1.ID FROM a1, b2, c3, d4 WHERE a1.ID = 1;



Ausführungsdauer/-last: 3 sec/100% [lediglich mal angenommen]

Und die DB-Software wird verworfen, weil "unperformant" und "funktioniert nur richtig mit DISTINCT".



Richtig wäre natürlich gewesen, die nicht benötigten Tabellen aus dem SELECT herauszunehmen, dann bräuchte nur obiger Punkt 1 durchgeführt werden:

SELECT a1.ID FROM a1, b2, c3, d4 WHERE a1.ID = 1;



Ausführungsdauer/-last: 0.001 sec/10% [auch lediglich mal angenommen]







diu vive floreque.
Spockus

erreicht am 04.03.2008 09:47:23

geschrieben von

Login

E-Mail:
  

Passwort:
  

Beitrag anfügen

Symbol:
 
 
 
 
 
 
 
 
 
 
 
 
 

Überschrift: