【问题标题】:SQL Server sp_ExecuteSQL and Execution PlansSQL Server sp_ExecuteSQL 和执行计划
【发布时间】:2011-04-12 06:01:15
【问题描述】:

我有一个查询,它在 SQL Server Management Studio 中非常快,在 sp_ExecuteSQL 下运行时非常慢。

这与在 sp_ExecuteSQL 下运行时没有缓存执行计划有关吗?

【问题讨论】:

  • 我想知道“sp_executesql 不缓存计划”的神话何时会消失 - 阅读The curse and blessings of dynamic SQL
  • @OMG Ponies - 参数嗅探可能是 sp_ExecuteSQL 的问题吗?
  • @JNK:自从遇到这种行为后,无论如何我都默认设置了反参数嗅探。
  • @JNK - 它缓存计划并重用它,所以是的。

标签: sql sql-server sql-server-2005 tsql sql-execution-plan


【解决方案1】:

没有。

您可以查看两个执行计划并使用以下查询进行比较。

SELECT usecounts, cacheobjtype, objtype, text, query_plan, value as set_options
FROM sys.dm_exec_cached_plans 
CROSS APPLY sys.dm_exec_sql_text(plan_handle) 
CROSS APPLY sys.dm_exec_query_plan(plan_handle) 
cross APPLY sys.dm_exec_plan_attributes(plan_handle) AS epa
where text like '%Some unique string in your query%' 
                                          and attribute='set_options'

sp_executesql 版本的 objtype 为“已准备好”

【讨论】:

  • 为什么执行计划会有如此大的不同?例如,我直接从 Sql Management Studio 中查看了我的查询执行计划(需要 3 秒),并从 sp_executeSql 中查看了执行计划(需要 5 分钟以上)。 sp_executeSql 的计划完全忽略了直接调用找到的一些关键索引。有人可以解释为什么来自管理工作室的调用会找到密钥,但通过 sp_ExecuteSql 的调用却没有?
  • @NathanTregillus - 可能是参数嗅探,您可以查看缓存的计划 XML 以查看计划实际编译时使用的参数值。
  • 感谢@MartinSmith 的回复。这实际上是由于我们在视图中如何使用 contextInfo 作为过滤器,以及它如何没有被考虑到执行计划中
【解决方案2】:

经历了同样的行为。 (设置选项相等) 常规查询生成并行计划并使用 sp_executesql 生成串行计划。

declare @xyzParam1 datetime,@xyzParam2 datetime
select @xyzParam1='Sep  1 2014 12:00:00:000AM',@xyzParam2='Sep 26 2014 11:59:59:000PM'
SELECT  *  FROM Theview WHERE  departuretime BETWEEN @xyzParam1 AND  @xyzParam2
;

 exec sp_executesql N'SELECT  *  FROM Theview WHERE  departuretime BETWEEN @xyzParam1 AND  @xyzParam2',N'@xyzParam1 datetime,@xyzParam2 datetime',@xyzParam1='Sep  1 2014 12:00:00:000AM',@xyzParam2='Sep 26 2014 11:59:59:000PM'

我设法获得了修改所用视图的最佳结果,因为它包含例如对始终预期的数据进行左连接。 (转换为INNER join)

现在常规查询选择与使用 sp_executesql 获得的计划相同的计划,并且性能要好得多。

【讨论】:

    【解决方案3】:

    我通过更新统计信息解决了 SSMS 中的 ad-hoc TSQL 和 sp_executesql 之间的查询计划差异。这是一个简单的查询,两次触及同一张表。 UPDATE STATISTICS sometable

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多