我无法在任何地方找到有关触发此重新编译原因的文档。我们正在调查突然的查询性能下降,我唯一能想到的是,在针对小型数据集执行时,计划为参数化查询重新编译,导致行估计混乱。我们注意到,当这个进程运行时(在它开始花费数小时而不是数秒之后)它对 tempdb 的影响非常大。消耗表的统计数据未更改,重新编译原因列表中唯一有意义的其他原因是#12“参数化计划已刷新”。
有问题的过程是在单个 INT 列上调用视图和过滤。这是通过实体框架完成的。类上只有1个Entity Key,是视图中主表的PK。所有记录都是独一无二的。
我很好奇是否有人可以向我指出那里的任何文档,这些文档解释了为什么可能由于“参数化计划刷新”而重新编译计划。
查询计划由于多种原因从缓存中刷新,包括老化、由于内存压力而刷新、由于用户操作(DBCC FREEPROCCACHE 等)而刷新、由于重新启动而刷新以及由于显式重新编译(选项(RECOMPILE 或 sp_recompile)而刷新).
如果您看不到强制重新编译或手动刷新的证据,那么很可能是该计划已过时或由于内存压力而被刷新。来自文档:Plan Cache Internals:
看看这个StackExchange 答案,它提供了大量关于计划重用和缓存的重要链接和信息。如果这种情况再次发生,您必须实施监控以找出确切原因,但您还应该考虑利用查询存储,这将允许您为此查询强制执行已知的良好计划并跟踪整个数据库的回归,因为这可能是也会影响其他查询。