update - SQL JOIN vs IN rendimiento?
update hint sql server (7)
Tengo un caso donde usar un JOIN o un IN me dará los resultados correctos ... ¿Qué típicamente tiene un mejor rendimiento y por qué? ¿Cuánto depende de qué servidor de base de datos está ejecutando? (Para su información estoy usando MSSQL)
El optimizador debe ser lo suficientemente inteligente como para darle el mismo resultado de cualquier manera para las consultas normales. Verifica el plan de ejecución y ellos deberían darte lo mismo. Si no lo hacen, normalmente consideraría que JOIN es más rápido. Sin embargo, todos los sistemas son diferentes, por lo que debe crear un perfil del código en su sistema para estar seguro.
Es curioso que lo menciones, hice una publicación en el blog sobre este mismo tema.
Ver Oracle vs MySQL vs SQL Server: Agregación vs Uniones
Respuesta corta: debe probarlo y las bases de datos individuales varían mucho.
Eso es bastante difícil de decir: para averiguar realmente cuál funciona mejor, necesitaría realmente crear un perfil de los tiempos de ejecución.
Como regla general, creo que si tiene índices en sus columnas de clave externa, y si está usando solo (o principalmente) condiciones de UNIÓN INTERNA, entonces el JOIN será un poco más rápido.
Pero tan pronto como empiece a usar OUTER JOIN, o si le faltan índices de clave externa, el IN podría ser más rápido.
Bagazo
Este hilo es bastante viejo, pero aún se menciona a menudo. Para mi gusto personal, es un poco incompleto, porque hay otra manera de preguntar a la base de datos con la palabra clave EXISTS que me pareció más rápida que nunca.
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 el db 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 una gran cantidad de registros en el escaneo de la tabla puede ser la consecuencia. Con IN o un JOIN esto sería un escaneo de tabla completo, con EXISTS esto sería solo un escaneo de tabla parcial (hasta que se encuentre el primer registro coincidente).
Si hay una gran cantidad de registros en b que tienen el mismo valor de col, también perderá mucha memoria para leer todos estos registros en un espacio temporal solo para encontrar que su condición está satisfecha. Con existe esto generalmente se puede evitar.
A menudo he encontrado EXISTS más rápido que IN incluso si hay un índice. Depende del sistema de base de datos (el optimizador), los datos y, por último, no menos importante del tipo de índice que se utiliza.
La implementación de cada base de datos pero probablemente puedas adivinar que todos resuelven problemas comunes de la misma manera. Si está utilizando MSSQL eche un vistazo al plan de ejecución que se genera. Puede hacer esto al encender los planes de perfilador y ejecuciones. Esto le dará una versión de texto cuando ejecute el comando.
No estoy seguro de qué versión de MSSQL está utilizando, pero puede obtener una gráfica en SQL Server 2000 en el analizador de consultas. Estoy seguro de que esta funcionalidad se esconde en SQL Server Studio Manager en versiones posteriores.
Eche un vistazo al plan de exención. En la medida de lo posible, evite los escaneos de tabla a menos que, por supuesto, su tabla sea pequeña, en cuyo caso un escaneo de tabla es más rápido que usar un índice. Lea sobre las diferentes operaciones de unión que produce cada escenario diferente.
Un informe interesante sobre las diferencias lógicas: SQL Server: JOIN vs IN vs EXISTS - la diferencia lógica
Estoy bastante seguro de que, suponiendo que se mantengan las relaciones y los índices, una unión tendrá un mejor rendimiento general (se requiere más esfuerzo para trabajar con esa operación que otros). Si lo piensas conceptualmente, entonces es la diferencia entre 2 consultas y 1 consulta.
Debe conectarlo al Analizador de consultas y probarlo y ver la diferencia. Consulte también el Plan de ejecución de consultas y trate de minimizar los pasos.
En términos generales, IN
y JOIN
son diferentes consultas 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 es UNIQUE
y está marcada como tal, ambas consultas producen el mismo plan en SQL Server
.
Si no es así, IN
es más rápido que JOIN
en DISTINCT
.
Vea este artículo en mi blog para detalles de rendimiento: