2011-03-21 11 views
7

He visto hipotéticamente a personas decir que hay casos en que una subconsulta puede ser más eficiente que una unión, pero en realidad nunca he visto un buen ejemplo de esto.¿Hay algún caso en SQL donde una subconsulta sea más eficiente que una combinación?

¿Cuál sería el caso cuando desee utilizar una subconsulta sobre una combinación?

+0

duda alguna vez hay una regla fija de uno siempre ser más rápido, especialmente teniendo en cuenta una base de datos de relación puede ser mejor o peor en algún cosas que otros. Probaría en ambos sentidos si necesita la solución más rápida para un problema determinado en su entorno. – Kuberchaun

Respuesta

4

El ejemplo clásico es la búsqueda de filas en una tabla que no tienen filas correspondientes en otra.

SELECT a.* 
    FROM TableA a 
    WHERE NOT EXISTS(SELECT NULL FROM TableB b WHERE b.parent_id = a.id) 

es generalmente mejor que

SELECT a.* 
    FROM TableA a 
     LEFT JOIN TableB b 
      ON a.id = b.parent_id 
    WHERE b.parent_id IS NULL 

Ver también: Left outer join vs NOT EXISTS

+1

+1 Depende de la implementación. Creo que en MySQL, por ejemplo, el rendimiento de la subconsulta es bastante malo en general. –

2

Al usar EXISTS con una sub-consulta, la solución de sub-consulta debe ser más rápida (en comparación con una combinación externa y verificar NULL), porque la "evaluación" de la sub-consulta finaliza tan pronto como la primera fila devuelto.

Mi experiencia es que la mayoría de las veces el optimizador de consultas elige el mismo plan de todos modos, así que no hay diferencia de rendimiento entre ambos (al menos con Oracle y PostgreSQL)

+0

¿Estás hablando de 'no existe'? –

+0

@Martin: me refiero a 'exists' - en comparación con' IS NOT NULL' en una combinación externa. –

+0

Eso no es semánticamente el mismo ¿verdad? 'EXISTS' no devolverá duplicados si la sub consulta tiene múltiples filas de unión. –

Cuestiones relacionadas