我的应用程序中的查询之一是超时。使用 SQL Server 分析器,我能够获得准确的错误 SQL 代码。这是一个sp_executesql动态语句,在服务器上的 SSMS 中运行时间超过 2 分钟。相比之下,临时运行相同的 SQL - 在外面sp_executesql但仍然有参数 - 只需要 600 毫秒。
查看缓存的执行计划,这 2 个查询具有完全相同的查询哈希但不同的计划。我 DBCC FREEPROCCACHEd 准备好的(慢的)希望接下来的执行可以重用临时的快速查询的计划。但事实并非如此。运行 sp_executesql 查询总是重新弹出一个新的、缓慢的计划。
按照此处的指南,我研究了参数嗅探的可能性。才发现我的4个参数在两个执行计划中完全一样。
我还尝试OPTION (RECOMPILE)更新相关表的统计信息,但没有结果。
执行计划有 2 个非常相似的主要分支,除了较慢的一个在分支的连接处有嵌套循环,而快速的没有。较低的分支叶子是两个计划中的索引扫描,除了较慢的一个读取数百万行,而较快的一个读取数千行。
在较快的索引的使用上没有明显的区别。顶部分支的组织方式略有不同。
准备好的查询可以重用临时缓存的执行计划吗?是什么导致了如此巨大的性能差异?