2010-07-22 6 views
6
select * 
from ContactInformation c 
where exists (select * from Department d where d.Id = c.DepartmentId) 

select * 
from ContactInformation c 
inner join Department d on c.DepartmentId = d.Id 

Tanto las consultas dan el mismo resultado, lo cual es bueno en el rendimiento sabia unirse o correlacionados sub consulta con la cláusula existe, cuál es mejor.unirse o consulta correlacionada con la cláusula existe, ¿cuál es mejor

Editar: -¿Existe alternet manera para que se une, con el fin de aumentar el rendimiento: - En las anteriores 2 consultas que quiero información del departamento, así como mesas ContactInformation

Respuesta

5

Generalmente, la cláusula EXISTS porque es posible que necesite DISTINCT para un JOIN para que produzca el resultado esperado. Por ejemplo, si tiene varias filas Department para una fila ContactInformation.

En el ejemplo anterior, el SELECT *:

  • significa salida diferente también, así que en realidad no son equivalentes
  • menos posibilidades de un índice que se usa porque usted está tirando de todas las columnas a cabo

decir que, incluso con una lista de columnas limitada, darán el mismo plan: hasta que necesite DISTINCT ... que es por eso que digo "existe"

+0

great..i got eso. – hrishi

+0

Editar: -hay alternativa alternet para uniones, para aumentar el rendimiento: - En las 2 consultas anteriores quiero información del departamento, así como de las tablas de información de contacto – hrishi

4

Es necesario medir y comparar - no hay regla de oro, cuál será mejor, depende de demasiadas variables y cosas en su sistema.

En SQL Server Management Studio, puede colocar ambas consultas en una ventana, elegir Include actual execution plan en el menú Consulta y luego ejecutarlas juntas.

alt text http://i31.tinypic.com/2rw48s2.png

Debe obtener una comparación de ambas sus planes de ejecución y un porcentaje de la cantidad del tiempo se dedicó a una o la otra consulta. Lo más probable es que ambos estén cerca del 50% en este caso. Si no, entonces sabrá cuál de las dos consultas tiene un mejor rendimiento.

Puede obtener más información sobre los planes de ejecución de SQL Server (e incluso descargar un libro electrónico gratuito) desde Simple-Talk - muy recomendable.

1

Su primera consulta debería mostrar columnas de Departamento, mientras que la segunda no debería.

Si solo está interesado en ContactInformation, estas consultas son equivalentes. Puede ejecutarlos y examinar el plan de ejecución de la consulta para ver cuál se ejecuta más rápido. Por ejemplo, en MYSQL, where exists es más eficiente con columnas que aceptan nulos, mientras que inner join funciona mejor si ninguna de las columnas es anulable.

2

Supongo que o bien desea agregar la palabra clave DISTINCT a la cláusula SELECT en su segunda consulta (o, con menos probabilidad, un departamento tiene solo un contacto).

Primero, siempre comience con consideraciones 'lógicas'. El constructo EXISTS es sin dudas más intuitivo, así que, si todo lo 'físico' es igual, iría con eso.

En segundo lugar, habrá un día en que necesitará puertos de este código, no necesariamente a un producto SQL diferente pero, por ejemplo, el mismo producto pero con un optimizador diferente. Un optimizador decente debería reconocer que ambos son equivalentes y presentar el mismo plan ideal.Considere que, en teoría, la construcción EXISTS tiene un poco más de potencial de cortocircuito.

En tercer lugar, pruébelo con un conjunto de datos razonablemente grande. Si el rendimiento no es aceptable, comience a considerar las consideraciones "físicas" (pero le sugiero que siempre mantenga su código "lógicamente puro" en los comentarios para el día siguiente cuando llega el optimizador perfecto :)

Cuestiones relacionadas