1. 场景:
①存储过程执行慢,但是存储过程中拆出来的SQL语句执行并不慢。
②存储过程执行慢,但是重新执行存储过程(重新编译存储过程)后,存储过程执行正常。
2. 解决方案:
在存储过程中国对应的SQL语句后面使用OPTION (RECOMPILE) ,但是考虑此存储过程调用频繁,也可以使用 OPTION (OPTIMIZE FOR UNKNOWN)。
参考引用链接:https://www.cnblogs.com/kerrycode/p/9684192.html ;https://www.cnblogs.com/kerrycode/p/9650629.html;
对使用OPTION(RECOMPILE)还是OPTION (OPTIMIZE FOR UNKNOWN)感到困惑和极度难以取舍,后面总结了一下:
1:执行不频繁的存储过程,使用OPTION(RECOMPILE)要优先与OPTION (OPTIMIZE FOR UNKNOWN)
2:执行频繁的存储过程,使用OPTION (OPTIMIZE FOR UNKNOWN)要优先于OPTION(RECOMPILE)
3:数据分布倾斜的厉害的情况下,优先使用OPTION(RECOMPILE)
4: 使用OPTION (OPTIMIZE FOR UNKNOWN)会生成一个稳定、统一的执行计划,如果这个执行计划的效率基本能满足用户需求,那么优先使用OPTION (OPTIMIZE FOR UNKNOWN)