¿SQL JOIN vs rendimiento IN?

Resuelto DigitalZebra asked hace 15 años • 6 respuestas

Tengo un caso en el que usar JOIN o IN me dará los resultados correctos... ¿Cuál normalmente tiene mejor rendimiento y por qué? ¿Cuánto depende del servidor de base de datos que esté ejecutando? (Para su información, estoy usando MSSQL)

DigitalZebra avatar Jul 29 '09 20:07 DigitalZebra
Aceptado

En términos generales, INy JOINson consultas diferentes que pueden arrojar resultados diferentes.

SELECT  a.*
FROM    a
JOIN    b
ON      a.col = b.col

no es lo mismo que

SELECT  a.*
FROM    a
WHERE   col IN
        (
        SELECT  col
        FROM    b
        )

, a menos que b.colsea único.

Sin embargo, este es el sinónimo de la primera consulta:

SELECT  a.*
FROM    a
JOIN    (
        SELECT  DISTINCT col
        FROM    b
        )
ON      b.col = a.col

Si la columna de unión está UNIQUEmarcada como tal, ambas consultas generarán el mismo plan en formato SQL Server.

Si no es así, entonces INes más rápido que JOINen DISTINCT.

Consulte este artículo en mi blog para obtener detalles sobre el rendimiento:

  • INvs JOINvs vsEXISTS
Quassnoi avatar Jul 29 '2009 13:07 Quassnoi

Este hilo es bastante antiguo pero todavía se menciona con frecuencia. Para mi gusto personal está un poco incompleto, porque hay otra forma de preguntar a la base de datos con la palabra clave EXISTS que me pareció más rápida la mayoría de las veces.

Entonces, si solo está interesado en los valores de la tabla a, puede usar esta consulta:

SELECT  a.*
FROM    a
WHERE   EXISTS (
    SELECT  *
    FROM    b
    WHERE   b.col = a.col
    )

La diferencia puede ser enorme si col no está indexado, porque la base de datos no tiene que encontrar todos los registros en b que tengan el mismo valor en col, solo tiene que encontrar el primero. Si no hay un índice en b.col y la consecuencia podría ser una gran cantidad de registros en la exploración de la tabla ba. Con IN o JOIN esto sería un escaneo completo de la tabla, con EXISTS esto sería solo un escaneo parcial de la tabla (hasta que se encuentre el primer registro coincidente).

Si hay muchos registros en b que tienen el mismo valor de col, también desperdiciará mucha memoria leyendo todos estos registros en un espacio temporal solo para descubrir que se cumple su condición. Si existe, esto generalmente se puede evitar.

A menudo he encontrado EXISTES más rápido que IN incluso si hay un índice. Depende del sistema de base de datos (el optimizador), de los datos y, por último, del tipo de índice que se utiliza.

S.Roeper avatar Feb 19 '2013 10:02 S.Roeper