Se me han presentado dos formas de hacer una misma consulta, pero no sé si una será más rápida que la otra o si los SGBD son listos y da igual.
Supongamos que tengo dos tablas (t1 y t2 para abreviar): t1 es una tabla bastante grande y t2 no lo es tanto. Tengo que componerlas a través de una clave (llamémosla "x" en ambas tablas) y eso se hace así:
SELECT t1.c1,t2.c2 /*O los campos que sean*/
FROM
t1 LEFT JOIN t2 ON t1.x=t2.x;
Hast aquí no hay dudas. Ahora bien, supongamos que en realidad sólo me interesan los registros en que se cumple que t1.campo='valor'. Ahora tengo dos posibilidades.
La evidente:
SELECT t1.c1,t2.c2
FROM
t1 LEFT JOIN t2 ON t1.x=t2.x
WHERE
t1.campo='valor';
o una haciendo uso de una subselect:
SELECT t1.c1,t2.c2
FROM
(SELECT c1,x FROM t1 WHERE campo='valor') t1
LEFT JOIN
t2 ON t1.x=t2.x;
La pregunta es, ¿hay diferencias de rendimiento? En principio, en el primer caso se componen las dos tablas y, luego, de la tabla resultante se eligen los registros adecuados. En cambio, en el segundo caso se escogen los registros que interesan de t1 y sólo con esos registros se hace la composición. Recordemos además que la tabla t1 es la grande, así que la composición después de filtrarla será muchísimo menor.Debería ser más rápido el segundo caso. Pero, quizás (y esto es lo que no sé) los SGBD no actúan en el mismo orden en que yo leo y se dedican, antes de componer, a eliminar registros según lo que ponga la clásula where.