小编gui*_*e31的帖子

查询计划不重复用于相同的查询 sp_executesql vs adhoc

我的应用程序中的查询之一是超时。使用 SQL Server 分析器,我能够获得准确的错误 SQL 代码。这是一个sp_executesql动态语句,在服务器上的 SSMS 中运行时间超过 2 分钟。相比之下,临时运行相同的 SQL - 在外面sp_executesql但仍然有参数 - 只需要 600 毫秒。

查看缓存的执行计划,这 2 个查询具有完全相同的查询哈希但不同的计划。我 DBCC FREEPROCCACHEd 准备好的(慢的)希望接下来的执行可以重用临时的快速查询的计划。但事实并非如此。运行 sp_executesql 查询总是重新弹出一个新的、缓慢的计划。

在此处输入图片说明

按照此处的指南,我研究了参数嗅探的可能性。才发现我的4个参数在两个执行计划中完全一样。

在此处输入图片说明

我还尝试OPTION (RECOMPILE)更新相关表的统计信息,但没有结果。

执行计划有 2 个非常相似的主要分支,除了较慢的一个在分支的连接处有嵌套循环,而快速的没有。较低的分支叶子是两个计划中的索引扫描,除了较慢的一个读取数百万行,而较快的一个读取数千行。

在此处输入图片说明 在此处输入图片说明

在较快的索引的使用上没有明显的区别。顶部分支的组织方式略有不同。

准备好的查询可以重用临时缓存的执行计划吗?是什么导致了如此巨大的性能差异?

sql-server optimization execution-plan

5
推荐指数
1
解决办法
144
查看次数

标签 统计

execution-plan ×1

optimization ×1

sql-server ×1