我构建了一个存储过程,可以在拥有许多仓库的公司中找到最短路径。该过程被系统大量使用。经过许多优化,包括内存优化表,如果我运行 sp_BlitzCache,我有 2 个警告:
- 参数嗅探;
- 您的缓存中有 83866 个计划,其中 100.00% 计划在过去 24 小时内创建,100.00% 在过去 4 小时内创建,100.00% 在过去 1 小时内创建。
该过程仅使用参数(无硬编码值)调用。您可以在此处找到查询计划:https ://www.brentozar.com/pastetheplan/?id=r1rW59QvN 。
我真的不明白为什么引擎会为每次执行生成一个计划以及我应该检查什么。此外,sp_BlitzCache 说我们找不到此查询的计划。造成这种情况的可能原因包括动态 SQL、RECOMPILE 提示和加密代码。我既没有动态 SQL,也没有重新编译提示,也没有加密代码。
我应该检查什么?
更新
正如 Jeroen Mostert 在评论中建议的那样,我检查了此过程对服务器的影响(感谢您的回复!),此过程使用了服务器上关于平均 IO 的前 10 个过程中的 0.66%,但它是唯一没有计划的过程,所以问题仍然存在:为什么有这么多计划?
我没有尝试在没有内存优化表的情况下运行存储过程。我不得不使用它们,因为 proc 需要像闪电一样快地运行(在某些情况下运行不到 30 毫秒)。此外,如果没有优化表内存,我没有勇气执行该过程,因为我无法在测试服务器上重现工作负载。
谢谢!