Ні , Microsoft не містить жодної документації, яка б гарантувала поведінку, тому це не гарантується .
Крім того, якщо припустити, що стаття Simple Talk є правильною і що фізичний оператор Concatenation завжди обробляє введення в порядку, показаному в плані (дуже ймовірно, що це правда), то без гарантії, що SQL Server завжди буде генерувати плани, які зберігатимуть те саме порядку між текстом запиту та планом запиту, вам лише трохи краще.
Ми можемо дослідити це ще далі. Якщо оптимізатору запитів вдалося переупорядкувати вхід оператора Concatenation, у недокументованому DMV повинні існувати рядки, sys.dm_exec_query_transformation_stats
відповідні цій оптимізації.
SELECT * FROM sys.dm_exec_query_transformation_stats
WHERE name LIKE '%CON%' OR name LIKE '%UNIA%'
У версії SQL Server 2012 Enterprise Edition виходить 24 рядки. Ігноруючи помилкові збіги для перетворень, пов’язаних з константами, є одна трансформація, пов’язана з фізичним оператором UNIAtoCON
об'єднання (Союз усіх до конкатенації). Отже, на рівні фізичного оператора виявляється, що після того, як буде обраний оператор конкатенації, він буде оброблений у порядку логічного Union All оператора, з якого він був похідний.
Насправді це не зовсім так. Існують переописування після оптимізації, які можуть переупорядкувати входи до фізичного оператора конкатенації після завершення оптимізації на основі витрат. Один з прикладів виникає, коли об'єднанню підпорядковується мета рядка (тому, можливо, важливо спочатку прочитати з більш дешевого введення). Докладніші відомості див. У розділі UNION ALL
Оптимізація Пола Білого.
Це пізнє фізичне перезапис було функціональним аж до SQL Server 2008 R2, але регрес означав, що він більше не застосовується до SQL Server 2012 та пізніших версій. Виправлення було видано , що це відновили перезапису для SQL Server 2014 , а потім (НЕ 2012) з оптимізатором запитів виправлень включено (наприклад , прапор трасування 4199).
Але про логічний союз All operator ( UNIA
)? Існує UNIAReorderInputs
перетворення, яке може змінити порядок введення. Також є два фізичні оператори, за допомогою яких можна реалізувати логічний Union All UNIAtoCON
і UNIAtoMERGE
(Union All to Merge Union).
Тому виявляється, що оптимізатор запитів може переупорядкувати введення для UNION ALL
; однак, схоже, це не є звичайною трансформацією (нульове використання UNIAReorderInputs
на SQL-серверах, які я легко доступний. Ми не знаємо обставин, які змусили б оптимізатор використовувати UNIAReorderInputs
; хоча він, безумовно, використовується, коли керівництво плану або використання підказка щодо плану використовується для примусового створення генерованого плану, використовуючи згадані вище фізичні упорядковані введення рядків
Чи є спосіб, щоб двигун обробляв декілька входів одночасно?
Фізичний оператор Concatenation може існувати в паралельному розділі плану. З деякими труднощами мені вдалося скласти план з паралельними конкатекаціями, використовуючи наступний запит:
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)
Отже, у найсуворішому сенсі, фізичний оператор Concatenation, здається, завжди обробляє введення послідовно (перший перший, нижній другий); однак оптимізатор може змінити порядок входів перед вибором фізичного оператора або використовувати об'єднання об'єднань замість об'єднання.