2010-03-22 15 views
6

Necesito buscar todos los hogares con pedidos. No me importan los datos del pedido en absoluto, solo que existe. (Uso de SQL Server)¿Es un JOIN más o menos eficiente que EXISTS IN cuando no se necesitan datos de la segunda tabla?

¿Es más eficiente para decir algo como esto:

SELECT HouseholdID, LastName, FirstName, Phone 
FROM Households 
INNER JOIN Orders ON Orders.HouseholdID = Households.HouseholdID 

o esto:

SELECT HouseholdID, LastName, FirstName, Phone 
FROM Households 
WHERE EXISTS 
    (SELECT HouseholdID 
    FROM Orders 
    WHERE Orders.HouseholdID = Households.HouseholdID) 
+0

Lo DB (Oracle, SQL Server, MySQL, SQLite :-) está utilizando? – lexu

+0

¡Uy! Pregunta editada para incluir la información - SQL Server – twpc

Respuesta

3

Las 2 consultas no son equivalentes. El primero devolverá resultados múltiples si hay múltiples registros de unión. Los EXISTS probablemente sean más eficientes, especialmente si no existe una restricción confiable de FK que el optimizador pueda usar.

Para más detalles sobre este último punto véase el punto 9 aquí http://www.simple-talk.com/sql/t-sql-programming/13-things-you-should-know-about-statistics-and-the-query-optimizer/

+0

el artículo vinculado es para SQL Server, esto no se aplica a todas las bases de datos. Como digo en mi respuesta, esto depende de su base de datos, pero SQL Server optimizará EXISTS mejor que la unión. –

2

depende del motor de base de datos y lo eficiente que es la optimización de consultas. Un buen optimizador de base de datos madura hará que EXISTS sea más rápido, otros no. Sé que SQL Server puede hacer que la consulta sea más rápida, no estoy seguro de los demás.

0

Para una consulta tan trivial, no sería sorprendente que la ejecución de ambas variantes se reduzca a una sola forma, que será considerada la más eficaz por el sistema. Consulte el plan de ejecución de consultas para averiguarlo.

4

A no ser que se trata de una bastante rígida relación 1: 1 (lo que no parece tener mucho sentido dado un significado más amplio al de los hogares y autos) , sus consultas arrojarán resultados diferentes (si hay más filas coincidentes en la tabla Pedidos).

En Oracle (y en la mayoría de los DBMS), esperaría que la versión existente funcione mucho más rápido ya que solo necesita encontrar una fila en los pedidos para que el registro de hogares califique.

Independientemente del DBMS, esperaría que el plan de explicación mostrara la diferencia (si las tablas son significativamente grandes, la consulta no se resolvería mediante exploraciones de tablas completas).

¿Has probado probalo? ¿Permitir el almacenamiento en caché?

C.

0

En postgres, existe sería más rápido que unen interior.

1

Como se dijo anteriormente, sus consultas arrojarán diferentes resultados si al menos una casa tiene más de un pedido.

Puede solucionar esto utilizando DISTINCT, pero EXISTS (o IN) es más eficiente.

Ver este artículo:

Cuestiones relacionadas