Não , não há documentação da Microsoft que garanta o comportamento, portanto não é garantido .
Além disso, supondo que o artigo do Simple Talk esteja correto e que o operador físico de concatenação sempre processe as entradas na ordem mostrada no plano (muito provável que seja verdade), sem garantia de que o SQL Server sempre gerará planos que mantêm o mesmo a ordem entre o texto da consulta e o plano de consulta, você está apenas um pouco melhor.
Podemos investigar isso ainda mais. Se o otimizador de consulta conseguiu reordenar a entrada do operador Concatenação, deve haver linhas na DMV não documentada, sys.dm_exec_query_transformation_stats
correspondente a essa otimização.
SELECT * FROM sys.dm_exec_query_transformation_stats
WHERE name LIKE '%CON%' OR name LIKE '%UNIA%'
No SQL Server 2012 Enterprise Edition, isso produz 24 linhas. Ignorando as correspondências falsas para transformações relacionadas a constantes, há uma transformação relacionada ao Operador Físico de Concatenação UNIAtoCON
(União Tudo à Concatenação). Portanto, no nível do operador físico, parece que uma vez selecionado o operador de concatenação, ele será processado na ordem do operador lógico da União Todos os quais foi derivado.
De fato, isso não é bem verdade. Existem reescrições pós-otimização que podem reordenar as entradas para um operador físico de concatenação após a conclusão da otimização baseada em custos. Um exemplo ocorre quando a concatenação está sujeita a uma meta de linha (portanto, pode ser importante ler primeiro a entrada mais barata). Consulte UNION ALL
Otimização por Paul White para obter mais detalhes.
Essa reescrita física tardia foi funcional até e incluindo o SQL Server 2008 R2, mas uma regressão significou que não era mais aplicada ao SQL Server 2012 e posterior. Foi lançada uma correção que restabelece essa reescrita no SQL Server 2014 e posterior (não em 2012) com os hotfixes do otimizador de consulta habilitados (por exemplo, sinalizador de rastreamento 4199).
Mas sobre o operador Logical Union All ( UNIA
)? Há uma UNIAReorderInputs
transformação, que pode reordenar as entradas. Também há dois operadores físicos que podem ser usados para implementar uma União lógica UNIAtoCON
e , UNIAtoMERGE
(União tudo para mesclar União).
Portanto, parece que o otimizador de consulta pode reordenar as entradas para a UNION ALL
; no entanto, não parece ser uma transformação comum (nenhum uso de UNIAReorderInputs
nos servidores SQL que tenho prontamente acessível. Não sabemos as circunstâncias que levariam o otimizador a usar UNIAReorderInputs
; embora certamente seja usado quando um guia ou uso de um plano A dica de plano é usada para forçar um plano gerado usando as entradas reordenadas físicas da meta de linha mencionadas acima.
Existe uma maneira de o mecanismo processar mais de uma entrada de cada vez?
O operador físico de concatenação pode existir dentro de uma seção paralela de um plano. Com alguma dificuldade, consegui produzir um plano com concatenações paralelas usando a seguinte 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)
Portanto, no sentido mais estrito, o operador físico de concatenação parece sempre processar as entradas de maneira consistente (primeiro primeiro, segundo inferior); no entanto, o otimizador pode alternar a ordem das entradas antes de escolher o operador físico ou usar uma união de mesclagem em vez de uma concatenação.