代码之家  ›  专栏  ›  技术社区  ›  AJM

SQL Server sp_ExecuteSQL和执行计划

  •  6
  • AJM  · 技术社区  · 14 年前

    我有一个查询,它在SQLServerManagementStudio中运行得非常快,在sp\uExecuteSQL下运行时非常慢。

    这是否与在sp\u ExecuteSQL下运行时不发生执行计划缓存有关?

    2 回复  |  直到 4 年前
        1
  •  8
  •   Martin Smith    14 年前

    不。

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

    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 “准备好的”

        2
  •  1
  •   Magier    8 年前

    经历了同样的行为。(设置选项相等)

    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'
    

    我设法通过修改所用的视图获得了最佳结果,因为它包含了总是期望的数据的左连接(left join)。(转换为内部联接)

    现在,常规查询选择与使用sp\u executesql获得的计划相同的计划,性能要好得多。

        3
  •  0
  •   Eric Petro    6 年前