我有两个查询,它们大多是同一个 where 表达式。它们联合在一起以获得完整的结果集。查询中没有分组,也没有排序,也没有区别。但是,直接在最终连接/选择运算符之前和任何连接之后有两种不同的类型。鉴于上述信息,我对这些不同的类型感到有点困惑。
任何人都可以深入了解为什么这个运营商在这个计划中吗?
FWIW,我重写了这个查询,只是想填补知识空白/纠正误解。
谢谢
我有两个查询,它们大多是同一个 where 表达式。它们联合在一起以获得完整的结果集。查询中没有分组,也没有排序,也没有区别。但是,直接在最终连接/选择运算符之前和任何连接之后有两种不同的类型。鉴于上述信息,我对这些不同的类型感到有点困惑。
任何人都可以深入了解为什么这个运营商在这个计划中吗?
FWIW,我重写了这个查询,只是想填补知识空白/纠正误解。
谢谢
查询被写成两个相似的
UNION ALL
分支——其中之一如下。该分支的执行计划更多地遵循以下几行 (*)。
不是通过对
#Events
(741 行)和CM.Staging
(120907 行)进行连接来驱动查询,然后进行半连接以查看是否存在匹配项,而是#UpdatedStagingRecords
从#UpdatedStagingRecords
自身(2 行)驱动查询并在CM.Staging
.连接不能简单地更改为内部连接并像那样保留,因为 StagingKey 中的重复行
#UpdatedStagingRecords
可能导致结果中出现重复行,而原始exists
语法不会出现这些行。所以这些被
DISTINCT
-ification 步骤删除了。这同样适用于 the 的另一个分支
UNION
,但它非常相似,我没有具体说明。(*) - 实际的重复删除
DISTINCT
不是用 SQL 语法表示就能轻易表达的。DISTINCT
它实际上并没有根据预计的列值进行操作。它基于Bmknnnn
映射到#Events
表中物理行标识符的列来执行此操作。