いいえ、動作を保証するマイクロソフトのドキュメントはないため、保証されていません。
さらに、Simple Talkの記事が正しいこと、および連結物理演算子が常に計画に示されている順序で入力を処理すること(非常に可能性が高いこと)を想定し、SQL Serverが常に同じを維持する計画を生成することを保証せずにクエリテキストとクエリプランの間の順序は、わずかに改善されます。
ただし、これについてはさらに調査できます。クエリオプティマイザーが連結演算子の入力を並べ替えることができた場合、sys.dm_exec_query_transformation_stats
その最適化に対応して、文書化されていないDMVに行が存在するはずです。
SELECT * FROM sys.dm_exec_query_transformation_stats
WHERE name LIKE '%CON%' OR name LIKE '%UNIA%'
SQL Server 2012 Enterprise Editionでは、これにより24行が生成されます。定数に関連する変換の誤った一致を無視すると、連結物理演算子に関連する変換が1つありますUNIAtoCON
(すべてを連結に結合)。そのため、物理演算子レベルでは、連結演算子が選択されると、派生元の論理和演算子の順に処理されるように見えます。
実際、それはまったく真実ではありません。コストベースの最適化が完了した後、物理連結演算子への入力を並べ替えることができる最適化後の書き換えが存在します。1つの例は、連結が行ゴールの対象である場合に発生します(したがって、最初に安価な入力から読み取ることが重要な場合があります)。詳細については、Paul WhiteによるUNION ALL
最適化を参照してください。
その遅い物理書き換えは、SQL Server 2008 R2までは機能していましたが、回帰により、SQL Server 2012以降には適用されなくなりました。修正が発行されたクエリオプティマイザの修正プログラムで復職このSQL Serverの2014年のためのリライト以降(ではない2012年)が有効になっていること(例えば、トレースフラグ4199を)。
しかし、Logical Union All演算子(UNIA
)についてはどうでしょうか?UNIAReorderInputs
入力を並べ替えることができる変換があります。また、論理的なUnion Allを実装するために使用できる2つの物理演算子UNIAtoCON
とUNIAtoMERGE
(Union All to Merge Union)もあります。
したがって、クエリオプティマイザーは aの入力を並べ替えることができるようUNION ALL
です。ただし、一般的な変換ではないようです(UNIAReorderInputs
簡単にアクセスできるSQL Serverでの使用はゼロです。オプティマイザーを使用する状況はわかりませんが、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)
したがって、厳密な意味では、物理連結演算子は常に一貫した方法で入力を処理するように見えます(上から1番目、下から2番目)。ただし、オプティマイザーは、物理演算子を選択する前に入力の順序を切り替えるか、連結ではなくマージ結合を使用できます。