En muchas de nuestras consultas tenemos que relacionar dos o más tablas usando la cláusula JOIN. En general Firebird recupera muy rápido los datos, pero podemos conseguir aún una mayor velocidad con la técnica mostrada a continuación.

Un JOIN normal sería algo como:

SELECT
   *
FROM
   MiTabla1
JOIN
   MiTabla2
      ON MiRelación_entre_MiTabla1_y_MiTabla2
WHERE
   MiCondición

Funciona muy bien y obtendremos lo que queremos pero podemos aumentar la velocidad de respuesta si a esa misma consulta la escribimos así:

SELECT
   *
FROM
   (SELECT
       MiColumna1,
       MiColumna2,
       MiColumna3
    FROM
       MiTabla1
    WHERE
       MiCondición
   ) AS MiFiltro
JOIN
   MiTabla2
      ON MiRelación_entre_MiFiltro_y_MiTabla2

¿Qué hicimos aquí?

  • Primero, filtramos los datos de la tabla principal para obtener solamente las filas que nos interesan. O sea que construimos lo que se llama una tabla derivada
  • Segundo, relacionamos el filtro de la tabla principal (o sea, la tabla derivada) con la tabla secundaria

 En un JOIN normal primero se relacionan las dos tablas y luego se filtra el conjunto resultado. En el JOIN optimizado en cambio primero se filtra la tabla principal y luego se relacionan las dos tablas. Eso en general (pueden existir excepciones) nos permitirá obtener más rápidamente el conjunto resultado.

Conclusión:

Muchas veces podemos obtener más rápidamente el conjunto resultado si usamos una tabla derivada para filtrar las filas de la tabla principal antes de relacionarla con la tabla secundaria. Si necesitas mayor velocidad en un SELECT que tiene JOIN y que tiene WHERE, prueba esta técnica y verifica el tiempo de respuesta.

Artículos relacionados:

Tablas derivadas

Entendiendo subconsultas y tablas derivadas

El índice del blog Firebird21

El foro del blog Firebird21