entre diferencia all sql sql-server-2008 sql-server-2008-r2 database-performance query-tuning

diferencia - La UNION de SQLServer tiene un mejor rendimiento que UNION ALL?



union sql oracle (2)

Sé que UNION ALL supone tener un mejor desempeño que UNION (ver: rendimiento de unión versus unión ).

Ahora, tengo este gran procedimiento almacenado (con muchas consultas), donde El resultado final es un SELECT de dos secciones con un UNION entre ellos. Como ambos conjuntos de datos son extraños el uno para el otro, puedo usar UNION TODO, que supongo que es mejor (sin operación distinta).

Lo he comprobado en varias bases de datos y funcionó bien. El problema es que uno de mis clientes me dio su base de datos para ajustar el rendimiento, y cuando lo investigué noté que si cambio UNION ALL a UNION, el rendimiento es un poco mejor (!). Este es todo el cambio que he hecho en el procedimiento almacenado.

¿Puede alguien explicar por favor cómo puede ocurrir esta situación?

Gracias,
Ziv

Actualizar:
plan de ejecución adjunto de ambas consultas (la parte diff):


Esto puede ocurrir si tiene algunas filas duplicadas. Una declaración UNION efectivamente hace SELECT DISTINCT en el conjunto de resultados. Si sabe que todos los registros devueltos son exclusivos de su sindicato, use UNION ALL ya que brinda resultados más rápidos. Sin embargo, para los duplicados en su caso, supongo que hay una cantidad suficiente de duplicados como para hacer que la UNIÓN sea más rápida: puede probar esto contando los duplicados y eliminándolos. Luego, ejecutar UNION ALL puede volver a ser el "ganador" ...

Espero que esto ayude.


Hiciste referencia a otro tema que apuntaba a este artículo .

Si marca este, aquí hay dos planes de ejecución diferentes. La gran diferencia es la Distinct Sort que hizo el peor rendimiento.

En su ejemplo, los dos planes de ejecución tienen el mismo paso con una operación física Merge Join (solo las operaciones lógicas son diferentes). Incluso las estimaciones son las mismas.

Ahora estoy realmente courios: ¿cuán grande es la diferencia entre las dos consultas?

Si no hizo lo siguiente, repita la prueba nuevamente:
1) use la siguiente línea antes de ejecutar el PRC:

DBCC FREEPROCCACHE DBCC DROPCLEANBUFFERS

Lo que hace que el caché sea claro y puede hacer una "ejecución en frío" en ambos casos. Puede consultar otro artículo aquí también.

2) Repita la ejecución varias veces para ver un avarage.

¿La diferencia todavía existe?