Diferencia de rendimiento: condición colocada en la cláusula INNER JOIN vs WHERE
Di que tengo una mesaorder
como
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
es una clave foránea de nuevo a laclient
mesaitemid
es una clave foránea de nuevo a unaitem
mesatype
es soloB
oS
amount
es un número enteroy una mesaprocessed
como
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
Necesito obtener todas las filas deorder
eso por lo mismoclientid
en el mismodate
tener oponentetype
valores. Tenga en cuentatype
solo puede tener uno de dos valores:B
oS
. En el ejemplo anterior esto sería filas23
y24
.
La otra restricción es que la fila correspondiente enprocessed
debe sertrue
Para elorderid
.
Mi consulta hasta ahora
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
PREGUNTA: Manteniendo elprocessed = true
como parte de la cláusula de unión está ralentizando la consulta hacia abajo. Si lo muevo a la cláusula WHERE, el rendimiento es mucho mejor. Esto ha despertado mi interés yMe gustaria saber por que.
Las claves primarias y las columnas de clave externa respectivas se indexan mientras que las columnas de valor (value
, processed
etc) no son.
Descargo de responsabilidad: he heredado esta estructura de base de datos y la diferencia de rendimiento es de aproximadamente 6 segundos.