我遇到了带有一些参数的sql select语句性能下降的问题,对于同一个查询,使用sp_executesql
执行此选择的方式需要两倍的内联方式。
问题是在sp_execute-way中sql server没有使用最佳执行计划。虽然计划不同,但似乎在两种情况下都正确使用了表的索引。我真的不明白为什么表现如此不同。
我的原始查询更复杂但是为了弄清楚发生了什么,我将原始查询简化为具有3个表和2个连接的选择。主要区别在于最佳使用哈希匹配,我真的不知道这个意思,但这是我能看到的唯一区别。
最佳计划(哈希匹配,超过3秒)
错误的计划(没有哈希匹配,索引与上述相同,超过12秒)
我认为我的问题不是“参数嗅探”,在我的情况下,对于所有不同的参数值,查询总是很慢,因为执行计划总是不正确的。
OPTION (RECOMPILE)
没有帮助,sp_executesql
继续变慢,内联方式需要更多时间(因为查询总是编译执行计划)
表的统计信息已更新
我必须使用sp_executesql
方式,因为报告服务似乎将选择封装在sp_executesql
来电
有人知道sp_executesql
为什么会生成与内联查询不同(错误)的执行计划?
sp_executesql
中有没有可以正常使用的魔术选项? :)
最优
慢
答案 0 :(得分:2)
我的理解是sp_executesql在第一次执行后保留缓存的计划。后续查询可能使用错误的缓存计划。您可以使用以下命令清除整个 SQL Server过程缓存。
DBCC FREEPROCCACHE