不,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
和“ 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)
因此,从最严格的意义上讲,物理级联运算符似乎确实总是以一致的方式处理输入(从上到下,从下到上)。但是,优化器可以在选择物理运算符之前切换输入的顺序,或者使用合并联合而不是串联。