我的查询在SQL Server Management STudio中是超高速的,在sp_ExecuteSQL下运行时超级慢。
这是否与在spExecuteSQL下运行时未执行的执行计划的缓存有关?
答案 0 :(得分:8)
没有
您可以使用以下查询查看两个执行计划并进行比较。
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
“准备好”
答案 1 :(得分:1)
经历过相同的行为。 (设置选项相等) Regular Query生成并行计划并使用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
;
VS
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联接)
现在常规查询选择与使用sp_executesql获得的计划相同的计划,性能更好。
答案 2 :(得分:0)
我通过更新统计信息解决了SSMS中临时TSQL和sp_executesql在查询计划方面的差异。这是一个简单的查询,两次触及同一张表。 更新统计表