Nie , nie ma dokumentacji od Microsoft gwarantującej zachowanie, dlatego nie jest gwarantowana .
Dodatkowo, zakładając, że artykuł Simple Talk jest poprawny i że fizyczny operator konkatenacji zawsze przetwarza dane wejściowe w kolejności pokazanej w planie (najprawdopodobniej będzie to prawda), to bez gwarancji, że SQL Server zawsze wygeneruje plany, które zachowają to samo kolejność między tekstem zapytania a planem zapytań, tylko nieznacznie lepiej.
Możemy to jednak zbadać dalej. Jeśli optymalizator kwerend był w stanie zmienić kolejność danych wejściowych operatora konkatenacji, w nieudokumentowanym DMV powinny istnieć wiersze sys.dm_exec_query_transformation_stats
odpowiadające tej optymalizacji.
SELECT * FROM sys.dm_exec_query_transformation_stats
WHERE name LIKE '%CON%' OR name LIKE '%UNIA%'
W SQL Server 2012 Enterprise Edition daje to 24 wiersze. Ignorując fałszywe dopasowania dla transformacji związanych ze stałymi, istnieje jedna transformacja związana z fizycznym operatorem konkatenacji UNIAtoCON
(suma wszystkich konkatenacji). Tak więc na poziomie operatora fizycznego wydaje się, że po wybraniu operatora konkatenacji zostanie on przetworzony w kolejności logicznego operatora Union All, z którego został uzyskany.
W rzeczywistości nie jest to do końca prawda. Istnieją zapisy po optymalizacji, które mogą zmienić kolejność danych wejściowych do fizycznego operatora konkatenacji po zakończeniu optymalizacji opartej na kosztach. Jeden przykład występuje, gdy konkatenacja podlega celowi rzędu (więc może być ważne, aby najpierw przeczytać tańsze dane wejściowe). Zobacz UNION ALL
Optymalizacja autorstwa Paula White'a po więcej szczegółów.
Ta późna fizyczna przeróbka działała aż do SQL Server 2008 R2 włącznie, ale regresja oznaczała, że nie była już stosowana w SQL Server 2012 i późniejszych. Wydano poprawkę, która przywraca to przepisywanie dla SQL Server 2014 i późniejszych (nie 2012) z włączonymi poprawkami optymalizatora zapytań (np. Flaga śledzenia 4199).
Ale o operatorze logicznej unii wszystkie ( UNIA
)? Istnieje UNIAReorderInputs
transformacja, która może zmienić kolejność danych wejściowych. Istnieją również dwa fizyczne operatory, których można użyć do zaimplementowania logicznego połączenia Union All UNIAtoCON
i UNIAtoMERGE
(Union All to Merge Union).
Dlatego wydaje się, że optymalizator zapytań może zmienić kolejność danych wejściowych dla UNION ALL
; nie wydaje się jednak, że jest to powszechna transformacja (zerowe użycie UNIAReorderInputs
na serwerach SQL, które mam łatwo dostępny. Nie znamy okoliczności, które spowodowałyby użycie optymalizatora UNIAReorderInputs
; chociaż z pewnością jest on używany, gdy przewodnik lub użycie planu podpowiedź do planu służy do wymuszenia planu wygenerowanego przy użyciu fizycznych danych o zmienionej kolejności wierszy celu, o których mowa powyżej.
Czy istnieje sposób, aby silnik przetwarzał więcej niż jeden wkład na raz?
Fizyczny operator konkatenacji może istnieć w równoległej części planu. Z pewnym trudem byłem w stanie stworzyć plan z równoległymi konkatenacjami, używając następującego zapytania:
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)
Tak więc, w najściślejszym sensie, fizyczny operator konkatenacji wydaje się zawsze przetwarzać dane wejściowe w spójny sposób (pierwszy z góry, drugi z dołu); optymalizator może jednak zmienić kolejność danych wejściowych przed wyborem operatora fizycznego lub użyć połączenia scalającego zamiast konkatenacji.