¿SQL JOIN vs rendimiento IN?
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)
En términos generales, IN
y JOIN
son 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.col
sea ú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á UNIQUE
marcada como tal, ambas consultas generarán el mismo plan en formato SQL Server
.
Si no es así, entonces IN
es más rápido que JOIN
en DISTINCT
.
Consulte este artículo en mi blog para obtener detalles sobre el rendimiento:
IN
vsJOIN
vs vsEXISTS
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.