SQL Server 将基数估计器跟踪标志9481设置为开/关是否会自动重新编译受影响的计划?

vojdkbi0  于 2023-01-20  发布在  其他
关注(0)|答案(1)|浏览(116)

当前,我们使用的是-T9481。如果我们运行DBCC TRACEOFF 9481以使用新的基数估计器,将立即生效。
假设我有一个经常运行的查询,并且在关闭T9481之前该高速缓存中有一个执行计划。如果在关闭-T9481之后执行同一个查询,它会立即生成一个新的执行计划,还是会使用缓存中的现有查询计划,该计划是用旧的基数估计器生成的,直到它被刷新为止?
尝试了解是在关闭后为所有查询生成新的查询计划-T9481,还是仍然使用在运行前生成的旧计划-T9481,直到这些计划被刷新。

cngwdvgl

cngwdvgl1#

我在2019年测试了以下设置。

CREATE TABLE T1(C1 INT);

INSERT INTO T1 VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9);

CREATE TABLE T2(C1 INT, C2 VARCHAR(MAX));

GO

CREATE VIEW V1
AS
SELECT T1.C1
FROM T1 LEFT OUTER JOIN T2 ON T1.C1 = T2.C1
        LEFT OUTER JOIN T2 T3 ON T3.C1 = T2.C1
        LEFT OUTER JOIN T2 T4 ON T4.C1 = T2.C1

对于基数估计器模型版本70,估计将返回9行,对于基数估计器模型版本150,估计将返回20.0778行。
在“Actual execution plan enabled”(启用实际执行计划)的情况下运行以下命令,前2个计划的XML格式为CardinalityEstimationModelVersion="150",估计值为20行,后2个计划的XML格式为CardinalityEstimationModelVersion="70",估计值为9行。
这表明在更改跟踪标志之后,仍然可以重用缓存中的执行计划。

DBCC freeproccache
DBCC TRACEOFF (9481, -1);
EXEC ('SELECT * FROM V1;')
DBCC TRACEON (9481, -1);
EXEC ('SELECT * FROM V1;')

dbcc freeproccache
EXEC ('SELECT * FROM V1;')
DBCC TRACEOFF (9481, -1);
EXEC ('SELECT * FROM V1;')

(The上面使用EXEC的原因是为了确保语句解析和编译在设置跟踪标志之后进行,并且还可以轻松地确保正在执行的语句完全相同(包括任何白色)

相关问题