No , no hay documentación de Microsoft que garantice el comportamiento, por lo tanto, no está garantizado .
Además, suponiendo que el artículo de Simple Talk sea correcto y que el operador físico de Concatenación siempre procese las entradas en el orden que se muestra en el plan (muy probablemente sea cierto), sin una garantía de que SQL Server siempre generará planes que mantengan el mismo el orden entre el texto de la consulta y el plan de consulta, solo está un poco mejor.
Sin embargo, podemos investigar esto más a fondo. Si el optimizador de consultas pudo reordenar la entrada del operador de Concatenación, deberían existir filas en el DMV no documentado, sys.dm_exec_query_transformation_stats
correspondientes a esa optimización.
SELECT * FROM sys.dm_exec_query_transformation_stats
WHERE name LIKE '%CON%' OR name LIKE '%UNIA%'
En SQL Server 2012 Enterprise Edition, esto produce 24 filas. Ignorando las coincidencias falsas para las transformaciones relacionadas con las constantes, hay una transformación relacionada con el Operador físico de concatenación UNIAtoCON
(Union All to Concatenation). Por lo tanto, en el nivel del operador físico, parece que una vez que se selecciona un operador de concatenación, se procesará en el orden del operador lógico Union All del que se deriva.
De hecho, eso no es del todo cierto. Existen reescrituras posteriores a la optimización que pueden reordenar las entradas a un operador físico de Concatenación después de que se haya completado la optimización basada en costos. Un ejemplo ocurre cuando la Concatenación está sujeta a un objetivo de fila (por lo que puede ser importante leer primero la entrada más barata). Vea UNION ALL
Optimización por Paul White para más detalles.
Esa reescritura física tardía fue funcional hasta SQL Server 2008 R2 incluido, pero una regresión significaba que ya no se aplicaba a SQL Server 2012 y posteriores. Se ha emitido una corrección que restablece esta reescritura para SQL Server 2014 y posterior (no 2012) con las revisiones del optimizador de consultas habilitadas (por ejemplo, el indicador de seguimiento 4199).
¿Pero sobre el operador Logical Union All ( UNIA
)? Hay una UNIAReorderInputs
transformación que puede reordenar las entradas. También hay dos operadores físicos que se pueden usar para implementar un Union All lógico UNIAtoCON
y UNIAtoMERGE
(Union All para combinar Union).
Por lo tanto, parece que el optimizador de consultas puede reordenar las entradas para a UNION ALL
; sin embargo, no parece ser una transformación común (cero usos de UNIAReorderInputs
los Servidores SQL a los que tengo acceso fácilmente. No sabemos las circunstancias que harían que el optimizador use UNIAReorderInputs
; aunque ciertamente se usa cuando una guía de plan o uso La sugerencia de plan se utiliza para forzar un plan generado utilizando las entradas físicas reordenadas del objetivo de fila mencionadas anteriormente.
¿Hay alguna manera de que el motor procese más de una entrada a la vez?
El operador físico de concatenación puede existir dentro de una sección paralela de un plan. Con cierta dificultad, pude producir un plan con concatenaciones paralelas usando la siguiente consulta:
SELECT userid, regdate FROM ( --Users table is around 3mil rows
SELECT userid, RegDate FROM users WHERE userid > 1000000
UNION
SELECT userid, RegDate FROM users WHERE userid < 1000000
UNION all
SELECT userid, RegDate FROM users WHERE userid < 2000000
) d ORDER BY RegDate OPTION (RECOMPILE)
Por lo tanto, en el sentido más estricto, el operador de Concatenación física siempre parece procesar las entradas de manera coherente (el primero primero, el segundo inferior); sin embargo, el optimizador podría cambiar el orden de las entradas antes de elegir el operador físico, o usar una unión Merge en lugar de una Concatenación.