我在带有一些参数的 sql select 语句中遇到性能缓慢的问题,对于同一个查询,使用这种sp_executesql
方式执行这个选择需要两倍于内联方式的时间。
问题是在 sp_execute-way sql server 中没有使用最佳执行计划。尽管计划不同,但似乎在这两种情况下都正确使用了表的索引。我真的不明白为什么性能如此不同。
我的原始查询更复杂,但为了弄清楚发生了什么,我将原始查询简化为具有 3 个表和 2 个连接的选择。主要区别是在优化中使用哈希匹配,我真的不知道这是什么意思,但这是我能看到的唯一区别。
最优计划(哈希匹配,超过 3 秒)
错误的计划(没有哈希匹配,与上面相同的索引,超过 12 秒)
我认为我的问题不是“参数嗅探”,在我的情况下,对于所有不同的参数值,查询总是很慢,因为执行计划总是不正确的。
OPTION (RECOMPILE)
没有帮助,sp_executesql
继续运行缓慢并且内联方式需要更多时间(因为查询总是编译执行计划)表的统计信息已更新
我必须使用
sp_executesql
方式,因为报告服务似乎将选择封装在sp_executesql
调用中
有人知道为什么会sp_executesql
生成与内联查询不同的(错误的)执行计划吗?
编辑:查询没有使用相同的索引我猜是因为执行树不一样,sqlserver随意使用索引,附加你可以找到新的执行计划来强制使用相同的索引,性能现在更差,从慢查询12秒到15分钟以上(我已经取消)。我真的对更快地运行这个特定查询不感兴趣,因为我说这不是我正在处理的真正查询,我想弄清楚为什么内联查询和sp_executesql
-之间的执行计划如此不同询问。
有什么神奇的选择sp_executesql
可以正常工作吗?:)
最佳
减缓