所有证据都表明这是正确的,但我需要有人检查我的数学...
我有一个执行以下操作的存储过程:
- 在表中插入状态记录
- 表触发器触发将记录插入到不同的表中。
- 从表 A 中选择。
- 从表 A 中再次选择。
- 从表 A 中再次选择。
- 链式 CTE 从多个表中进行选择(但不涉及 1-4 中的任何一个表)。
我看到的是,每当 #5 中的一个大型表需要更新统计信息时,此过程的总处理时间是几分钟,而不是几秒钟。但是,#1 中插入的记录的时间戳是在 #5 导致的统计信息更新之后(使用扩展事件捕获)。看起来 SQL 评估了整个过程,如果任何表需要更新统计信息,它会在执行过程中的任何查询之前进行更新,然后执行过程的内容。
有人可以确认这是行为吗,或者我遗漏了其他什么?
对我来说,这是有道理的。proc 的计划基于编译时传递的参数值,仅此而已。变量是未知的。而且编译过程就像不存在过程代码元素一样。
在那个时间点,统计数据过时意味着统计数据更新发生在计划编制之前。
我认为一切都与您的观察一致。