En muchas consultas podemos obtener los mismos resultados si usamos la cláusula DISTINCT o la función EXISTS(). Pero obtener los mismos resultados no significa que ambas formas sean igual de rápidas.

Por ejemplo, podemos tener una tabla de PROFESIONES con estas filas:

DISTINCT_EXIST_1

Captura 1. Si haces clic en la imagen la verás más grande

Y una tabla de EMPLEADOS con estas filas:

DISTINCT_EXIST_2

Captura 2. Si haces clic en la imagen la verás más grande

Y lo que nos interesa saber es: ¿cuáles son las profesiones de nuestros empleados?

Consulta 1. Usando DISTINCT

SELECT
   DISTINCT
   P.PRO_IDENTI,
   P.PRO_NOMBRE
FROM
   PROFESIONES P
INNER JOIN
   EMPLEADOS E
      ON P.PRO_CODSUC = E.EMP_CODSUC AND
         P.PRO_IDENTI = E.EMP_IDEPRO
WHERE
   P.PRO_CODSUC >= 0

DISTINCT_EXIST_3Captura 3. Si haces clic en la imagen la verás más grande

Consulta 2. Usando la función EXISTS()

SELECT
   P.PRO_IDENTI,
   P.PRO_NOMBRE
FROM
   PROFESIONES P
WHERE
   P.PRO_CODSUC >= 0 AND
   EXISTS (SELECT E.EMP_IDENTI FROM EMPLEADOS E WHERE E.EMP_CODSUC = P.PRO_CODSUC AND E.EMP_IDEPRO = P.PRO_IDENTI)

DISTINCT_EXIST_4Captura 4. Si haces clic en la imagen la verás más grande

Conclusión:

Como puedes observar viendo la Captura 3 y la Captura 4, en ambos casos el resultado obtenido es el mismo, pero los tiempos y los consumos de memoria son distintos. En general, la función EXISTS() es más rápida que la cláusula DISTINCT … si hay un índice que pueda usar la función EXISTS() ¿por qué eso? porque si hay un índice, verifica que exista el dato buscado y listo, ya está; en cambio DISTINCT por cada fila que recorre debe verificar que ya no se encuentre en el resultado obtenido hasta ese momento, y eso lleva más tiempo.

Así que ¿en tu consulta has utilizado la cláusula DISTINCT? Cámbiala usando la función EXISTS() y verifica si obtienes más rápido el resultado.

Artículo relacionado:

El índice del blog Firebird21