不,Microsoft没有提供任何文档来保证该行为,因此不能保证。
此外,假设“简单谈话”文章是正确的,并且“串联”物理运算符始终按计划中显示的顺序处理输入(很可能是真的),则不能保证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运算符的顺序对其进行处理。
实际上那不是很正确。存在基于优化的后重写,可以在基于成本的优化完成后将输入重新排序到物理级联运算符。当串联受行目标约束时发生一个示例(因此,首先从便宜的输入中读取数据可能很重要)。有关更多详细信息,请参见Paul White的《UNION ALL优化》。
后来的物理重写在SQL Server 2008 R2之前(包括SQL Server 2008 R2)都起作用,但是回归表明它不再适用于SQL Server 2012及更高版本。一个修复已发出的是恢复了这个改写为SQL Server 2014和更高版本(不是2012)与查询优化启用修补程序(如跟踪标志4199)。
但是关于“逻辑联合所有”运算符(UNIA)?有一个UNIAReorderInputs转换,可以重新排列输入的顺序。还有两个物理运算符可用于实现逻辑“ Union All” UNIAtoCON和“ UNIAtoMERGEUnion 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)
因此,从最严格的意义上讲,物理级联运算符似乎确实总是以一致的方式处理输入(从上到下,从下到上)。但是,优化器可以在选择物理运算符之前切换输入的顺序,或者使用合并联合而不是串联。