我们在开发环境中遇到了一个问题,即 30 秒后 Web 服务器的过程调用超时。我跟踪查询并从 SSMS 手动运行它(相同的参数和所有),它在大约 2 秒内执行。然后我跑了
dbcc dropcleanbuffers
dbcc freeproccache
之后来自网络服务器的调用也及时完成了。
我怀疑应该使用相同的计划,因为我使用的是来自两个连接的完全相同的参数,但我不确定。
我的问题是:不同的连接是否可以有不同的计划或缓冲?或者它可能是我运行上述 dbcc 命令引起的其他副作用吗?
当您说“相同的参数和所有参数”时,您可能会发现使用了不同的凭据,或者根据时间安排未重复使用相同的编译计划。
我在这里怀疑第一个网络调用和 SSMS 调用使用了不同的计划。然后 DBCC 清除了计划,因此第二次网络调用按预期进行
有确定计划重用的标准,例如在所有对象引用(例如
dbo.table
nottable
)上使用模式,这将受到不同凭证的影响。然而,罪魁祸首通常是参数嗅探。看
如果做不到这一点,一些 SET 选项也可能不同:
注意:这些遵循良好的背景阅读......