为什么使用本地临时表(而不是全局临时表或常规表)会影响查询优化器选择糟糕的查询计划?

Ron*_*ldo 10 sql-server execution-plan temporary-tables

这个问题带来了查询优化器在简单查询的现有谓词中选择不好的搜索谓词的情况。运行一些测试后,我得出的结论是,糟糕的决定是由于使用了本地临时表而不是全局临时表或常规表。

db fiddle:本地临时表全局临时表常规表

索引查找信息

我在临时表文档中找不到任何可以解释我们在使用本地临时表而不是全局临时表或常规表时看到的不同行为的特征。这有合乎逻辑的原因还是可能是错误?

Mar*_*ith 5

这看起来像是一个怪癖,当尝试进行简单参数化与不尝试进行简单参数化时,该查询的优化会产生略有不同的树形。

这不是在本地临时表的情况下尝试的,而是针对全局临时表和永久表的。

自动参数化在任何情况下都不会成功,但是当在此查询上尝试时,它会导致树形略有不同,其中谓词的顺序从查询文本中保留(而不是在<>未尝试时使用第一个)。

我的假设是,在基于成本的优化之前对谓词的这种排序在某种程度上任意地确定了在这种情况下什么是搜索谓词以及什么是残差(即在基于成本的优化期间不考虑竞争选项)。

添加and 1=1是防止这种情况的一种方法,并且计划会恢复。

在此处输入图片说明