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
oderS
amount
ist eine ganze Zahlund 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.