Нет , от Microsoft нет документации, гарантирующей поведение, поэтому это не гарантируется .
Кроме того, если предположить, что статья Simple Talk верна, и что физический оператор конкатенации всегда обрабатывает входные данные в порядке, указанном в плане (очень вероятно, что это правда), то без гарантии того, что SQL Server всегда будет генерировать планы с одинаковыми порядок между текстом запроса и планом запроса, вам только немного лучше.
Мы можем исследовать это дальше, хотя. Если оптимизатору запросов удалось изменить порядок ввода оператора конкатенации, в недокументированном 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
Оптимизацию Пола Уайта для более подробной информации.
Это позднее физическое переписывание было функциональным вплоть до SQL Server 2008 R2 включительно, но регрессия означала, что оно больше не применяется к SQL Server 2012 и более поздним версиям. Выпущено исправление, которое восстанавливает это переписывание для SQL Server 2014 и более поздних версий (не 2012) с включенными исправлениями оптимизатора запросов (например, флаг трассировки 4199).
А про оператора логического союза все ( UNIA
)? Существует UNIAReorderInputs
преобразование, которое может изменить порядок входов. Есть также два физических оператора, которые можно использовать для реализации логического объединения всех UNIAtoCON
и UNIAtoMERGE
(объединения всех в объединение).
Поэтому кажется, что оптимизатор запросов может переупорядочить входные данные для a UNION ALL
; однако, это, кажется, не является обычным преобразованием (нулевое использование UNIAReorderInputs
на серверах SQL, которые у меня легко доступны. Мы не знаем обстоятельств, которые могли бы использовать оптимизатор UNIAReorderInputs
; хотя это, безусловно, используется при планировании или использовании Подсказка плана используется для форсирования плана, созданного с использованием физических переупорядоченных входов цели строки, указанных выше.
Есть ли способ, чтобы двигатель обрабатывал более одного входа одновременно?
Физический оператор конкатенации может существовать в параллельном разделе плана. С некоторыми трудностями мне удалось создать план с параллельными объединениями, используя следующий запрос:
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)
Таким образом, в самом строгом смысле, физический оператор конкатенации, кажется, всегда обрабатывает входные данные согласованным образом (верхний первый, нижний второй); однако оптимизатор может переключать порядок входов перед выбором физического оператора или использовать объединение слияния вместо конкатенации.