Sql 存储过程的大量查询计划

Sql 存储过程的大量查询计划,sql,sql-server,tsql,parameter-sniffing,sp-blitz,Sql,Sql Server,Tsql,Parameter Sniffing,Sp Blitz,我构建了一个存储过程,可以在一个有很多仓库的公司中找到最短的路径。该程序被系统大量使用。经过多次优化(包括内存优化表)后,如果运行sp_BlitzCache,则会出现两个警告: 参数嗅探 缓存中总共有83866个计划,其中100.00%的计划是在过去24小时内创建的,100.00%的计划是在过去4小时内创建的,100.00%的计划是在过去1小时内创建的 仅使用参数(无硬编码值)调用该过程。您可以在此处找到查询计划: 我真的不明白为什么引擎每次执行都会生成一个计划,我应该检查什么。另外,sp_Bl

我构建了一个存储过程,可以在一个有很多仓库的公司中找到最短的路径。该程序被系统大量使用。经过多次优化(包括内存优化表)后,如果运行sp_BlitzCache,则会出现两个警告:

  • 参数嗅探
  • 缓存中总共有83866个计划,其中100.00%的计划是在过去24小时内创建的,100.00%的计划是在过去4小时内创建的,100.00%的计划是在过去1小时内创建的
  • 仅使用参数(无硬编码值)调用该过程。您可以在此处找到查询计划:

    我真的不明白为什么引擎每次执行都会生成一个计划,我应该检查什么。另外,sp_BlitzCache表示,我们无法找到此查询的计划。可能的原因包括动态SQL、重新编译提示和加密代码。我既没有动态SQL、重新编译提示,也没有加密代码

    我应该检查什么

    更新

    我按照Jeroen Mostert在评论中的建议检查了此过程对服务器的影响(感谢您的回复!),此过程使用了服务器上10个关于平均IO的过程中的0.66%,但这是唯一没有计划的过程,所以问题仍然存在:为什么有这么多计划

    我没有尝试在没有内存优化表的情况下运行存储过程。我不得不使用它们,因为proc需要像闪电一样快速运行(在某些情况下运行时间不到30毫秒)。此外,如果没有表内存优化,我也没有勇气执行该过程,因为我无法在测试服务器上重现工作负载


    谢谢大家!

    您是否考虑过在应用程序中而不是在数据库中执行最短路径计算?这样,您就可以使用现有的图形库了。它实际上不是一个地理路线计算,而是一个包含车辆出发和到达时间、来源和目的地的时间表,因此只有一个带有几个筛选器的select和一个order by。如果这两个表未进行内存优化,是否会发生同样的情况?将内存优化的表与基于磁盘的表混合使用的情况仍然不如只使用一种对象(而只对基于内存的表使用本机编译的存储过程)那么顺利。此外,如果服务器选项“针对特定工作负载进行优化”尚未启用,请尝试启用该选项——这将减少存根的一次性计划缓存,这不会减少编译,但可能会减少其影响(而且本身几乎从来都不坏)。另一个值得探讨的问题是
    选项(保持[FIXED]计划)
    对于过程中怀疑是重新编译源的部分(再次想起内存优化表)。显然,需要注意确保这不会缓存不适当的计划,但它可以大大减少不必要的编译。(我不知道它是否对内存优化的表有任何影响,我只在基于磁盘的表中使用过它。)最后但并非最不重要的一点:检查这是否确实对您的服务器产生了可测量的影响。尽管重新编译并不好,但如果存储过程所做的工作远远超过了重新编译所需的工作(通常是这样),那么多余的计划即使不是最优的,也是可以生存的。计划存根可以减少内存使用,而CPU成本可以被吞噬。您是否考虑过在应用程序中而不是在数据库中执行最短路径计算?这样,您就可以使用现有的图形库了。它实际上不是一个地理路线计算,而是一个包含车辆出发和到达时间、来源和目的地的时间表,因此只有一个带有几个筛选器的select和一个order by。如果这两个表未进行内存优化,是否会发生同样的情况?将内存优化的表与基于磁盘的表混合使用的情况仍然不如只使用一种对象(而只对基于内存的表使用本机编译的存储过程)那么顺利。此外,如果服务器选项“针对特定工作负载进行优化”尚未启用,请尝试启用该选项——这将减少存根的一次性计划缓存,这不会减少编译,但可能会减少其影响(而且本身几乎从来都不坏)。另一个值得探讨的问题是
    选项(保持[FIXED]计划)
    对于过程中怀疑是重新编译源的部分(再次想起内存优化表)。显然,需要注意确保这不会缓存不适当的计划,但它可以大大减少不必要的编译。(我不知道它是否对内存优化的表有任何影响,我只在基于磁盘的表中使用过它。)最后但并非最不重要的一点:检查这是否确实对您的服务器产生了可测量的影响。尽管重新编译并不好,但如果存储过程所做的工作远远超过了重新编译所需的工作(通常是这样),那么多余的计划即使不是最优的,也是可以生存的。计划存根可以降低内存使用,而CPU成本可以被吞下。