Leistungsunterschied: Bedingung bei INNER JOIN vs WHERE-Klausel

Angenommen, ich habe einen Tischorder wie

id | clientid | type | amount | itemid | date
---|----------|------|--------|--------|-----------
23 | 258      | B    | 150    | 14     | 2012-04-03
24 | 258      | S    | 69     | 14     | 2012-04-03
25 | 301      | S    | 10     | 20     | 2012-04-03
26 | 327      | B    | 54     | 156    | 2012-04-04
clientid ist ein Fremdschlüssel zurück zumclient Tabelleitemid ist ein Fremdschlüssel zurück zuitem Tabelletype ist nurB oderSamount ist eine ganze Zahl

und einen Tischprocessed wie

id | orderid | processed | date
---|---------|-----------|---------
41 | 23      | true      | 2012-04-03
42 | 24      | true      | 2012-04-03
43 | 25      | false     | <NULL>
44 | 26      | true      | 2012-04-05     

Ich muss alle Zeilen abrufenorder das für das gleicheclientid auf demselbendate gegnerisch habentype Werte. Merken Sie sichtype kann nur einen von zwei Werten haben -B oderS. Im obigen Beispiel wären dies Zeilen23 und24.

Die andere Einschränkung ist, dass die entsprechende Zeile inprocessed muss seintrue für dieorderid.

Meine Anfrage bisher

SELECT c1.clientid,
       c1.date,
       c1.type,
       c1.itemid,
       c1.amount,
       c2.date,
       c2.type,
       c2.itemid,
       c2.amount

FROM   order c1
INNER JOIN order c2 ON c1.itemid    =  c2.itemid AND
                       c1.date      =  c2.date   AND
                       c1.clientid  =  c2.clientid AND
                       c1.type     <>  c2.type AND
                       c1.id        <  c2.id

INNER JOIN processed p1 ON p1.orderid   =  c1.id AND
                         p1.processed =  true
INNER JOIN processed p2 ON p2.orderid   =  c2.id AND
                         p2.processed =  true

FRAGE: Halten Sie dieprocessed = true als Teil der Join-Klausel wird die Abfrage verlangsamt. Wenn ich es in die WHERE-Klausel verschiebe, ist die Leistung viel besser. Das hat mein Interesse geweckt undIch würde gerne wissen warum.

Die Primärschlüssel- und die jeweiligen Fremdschlüsselspalten werden indiziert, während die Wertspalten (value, processed etc) nicht.

Haftungsausschluss: Ich habe diese DB-Struktur geerbt und der Leistungsunterschied beträgt ungefähr 6 Sekunden.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage