Query, Subqueries, Performance

ulfilas

Aktives Mitglied
Thread Starter
Dabei seit
25.11.2003
Beiträge
101
Reaktionspunkte
0
kann mir jemand kurz folgendes Verhalten erklären?

1. select a from tblX where [...]
laufzeit 0.0004sec

Ergebnis in Array abspeichern.

2. select b from tblY where c in (ERGEBNISMENGE A)
Laufzeit: 0.3sec

3. select b from tblY where c in (select a from tblX where [...])
Laufzeit gefühlte 20 Minuten

Wieso macht das einen solchen Unterschied?
 
Anhängig von DBMS, Anfrageoptimierer, Indeces etc.

Sollte der Anfrageoptimierer für jedes Tupel einzeln die Subquery ausführen, ists klar, dass es länger dauert. Ist die Subquery denn eine korrelierende?
 
tuuuuut. ist schon spät gerade.

Indizies sind gesetzt.
Der Subquery erzeugt mE genau jene Ergebnismenge A die in Query 2 genutzt wird. Letztendlich ist Query 3 die Kombination aus Query 2 und 1 (der steht in der Klammer).

MYISAM Tabelle
 
Naja ich geh mal davon aus, dass die Subquery nicht korrelierend ist und die Indeces sauber genutzt werden. Dann scheint der Anfrageoptimierer von MySQL in diesem Bezug Schrott zu sein. Ansonsten bräuchte man mehr Infos, um detaillierter analysieren zu können.
 
Also

tblA enthält eine nummer und ein datum (neben ein paar anderen hier nicht wichtigen Feldern). Beide Felder haben einen Index.

tblB enthält obige nummer und ebenfalls ein datum. Für jede Nummer können 1-n Einträge vorhanden sein. tblB enthält aktuelle Informationen zu dem Datendatz mit der nummer.

Query 1:
select nummer from tblA where datum>='2007-11-01' and datum<='2007-11-30';

Soll alle nummern raussuchen, die im November eingetragen wurden.
Diese werden im Array $nummern gespeichert (PHP)

Query 2:
select distinct nummer where nummer in (implode(",",$nummern)) and datum>='2007-11-01'

Soll alle Infos zu den obigen Nummern bringen.
Beide Queries einzeln gehen rasend schnell.

Stopfe ich 1 in 2

select distinct nummer where nummer in (select nummer from tblA where datum>='2007-11-01' and datum<='2007-11-30') and datum>='2007-11-01'

wird es lahm, obwohl es mE das gleiche ist....

Die Ergebnismenge ist identisch. (wenigstens was)
 
Nachtrag. Laufe ich über einen Join geht es auch schneller, aber die Ergebnismenge stimmt nicht
 
Zurück
Oben Unten