No , non esiste documentazione di Microsoft che garantisca il comportamento, quindi non è garantita .
Inoltre, supponendo che l'articolo di Simple Talk sia corretto e che l'operatore fisico di concatenazione elabori sempre gli input nell'ordine mostrato nel piano (molto probabilmente per essere vero), quindi senza una garanzia che SQL Server genererà sempre piani che mantengono lo stesso l'ordine tra il testo della query e il piano di query, stai solo leggermente meglio.
Possiamo approfondire ulteriormente questo però. Se Query Optimizer è stato in grado di riordinare l'input dell'operatore di concatenazione, dovrebbero esistere righe nel DMV non documentato, sys.dm_exec_query_transformation_stats
corrispondente a tale ottimizzazione.
SELECT * FROM sys.dm_exec_query_transformation_stats
WHERE name LIKE '%CON%' OR name LIKE '%UNIA%'
In SQL Server 2012 Enterprise Edition, questo produce 24 righe. Ignorando le false corrispondenze per le trasformazioni correlate alle costanti, esiste una trasformazione relativa all'operatore fisico di concatenazione UNIAtoCON
(Unione tutta alla concatenazione). Pertanto, a livello di operatore fisico, sembra che una volta selezionato un operatore di concatenazione, questo verrà elaborato nell'ordine dell'unione logica Tutto l'operatore da cui è stato derivato.
In realtà non è del tutto vero. Esistono riscritture post-ottimizzazione che possono riordinare gli input a un operatore di concatenazione fisico dopo il completamento dell'ottimizzazione basata sui costi. Un esempio si verifica quando la concatenazione è soggetta a un obiettivo di riga (quindi potrebbe essere importante leggere prima dall'input più economico). Vedi UNION ALL
Ottimizzazione di Paul White per maggiori dettagli.
Quella riscrittura fisica tardiva era funzionale fino a SQL Server 2008 R2 incluso, ma una regressione significava che non si applicava più a SQL Server 2012 e versioni successive. È stata emessa una correzione che ripristina questa riscrittura per SQL Server 2014 e versioni successive (non 2012) con gli aggiornamenti rapidi di Query Optimizer abilitati (ad es. Flag di traccia 4199).
Ma per quanto riguarda l'operatore Logical Union All ( UNIA
)? C'è una UNIAReorderInputs
trasformazione, che può riordinare gli input. Esistono anche due operatori fisici che possono essere utilizzati per implementare un'unione Tutti logica UNIAtoCON
e UNIAtoMERGE
(Unione tutti per unire unione).
Pertanto sembra che Query Optimizer possa riordinare gli input per a UNION ALL
; tuttavia, non sembra essere una trasformazione comune (zero utilizzi UNIAReorderInputs
sui server SQL di cui ho prontamente accessibile. Non conosciamo le circostanze che farebbero uso dell'ottimizzatore UNIAReorderInputs
; sebbene sia certamente usato quando una guida del piano o l'uso il suggerimento piano viene utilizzato per forzare un piano generato utilizzando gli input riordinati fisici dell'obiettivo di riga sopra menzionati.
C'è un modo per fare in modo che il motore elabori più di un input alla volta?
L'operatore fisico di concatenazione può esistere all'interno di una sezione parallela di un piano. Con qualche difficoltà, sono stato in grado di produrre un piano con concatenazioni parallele utilizzando la seguente query:
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)
Quindi, nel senso più stretto, l'operatore di concatenazione fisica sembra elaborare sempre gli input in modo coerente (primo in alto, secondo in basso); tuttavia, l'ottimizzatore potrebbe cambiare l'ordine degli input prima di scegliere l'operatore fisico o utilizzare un'unione di unione anziché una concatenazione.