MSSQL空查询计划

时间:2016-08-11 08:17:53

标签: sql-server stored-procedures

我在Query下执行以获取缓存的执行计划详细信息。我发现某些存储过程的Query_Plan为null。可能是什么原因 ?这是否意味着我的查询需要改进?

       SELECT plan_handle,usecounts, cacheobjtype, objtype, size_in_bytes, text,query_plan
         FROM sys.dm_exec_cached_plans 
  CROSS APPLY sys.dm_exec_sql_text(plan_handle)
  CROSS APPLY sys.dm_exec_query_plan(plan_handle)
        WHERE objtype = 'Proc' 
     ORDER BY usecounts DESC;

1 个答案:

答案 0 :(得分:2)

在某些条件下,query_plan列中未返回任何输出,如BOL所述:

  

在以下条件下,没有返回Showplan输出    sys.dm_exec_query_plan 返回表的query_plan列:

  • 如果使用plan_handle指定的查询计划已从计划缓存中逐出,则返回表的 query_plan 列为空。例如,如果捕获计划句柄与使用 sys.dm_exec_query_plan 之间存在时间延迟,则可能会出现这种情况。

  • 某些Transact-SQL语句未缓存,例如批量操作语句或包含大小超过8 KB的字符串文字的语句。无法使用 sys.dm_exec_query_plan 检索此类语句的XML Showplans,除非批处理当前正在执行,因为它们不存在于缓存中。

  • 如果Transact-SQL批处理或存储过程包含对用户定义函数的调用或对动态SQL的调用,例如使用EXEC(字符串),则用户定义函数的已编译XML Showplan为未包含在 sys.dm_exec_query_plan 返回的表中,用于批处理或存储过程。相反,您必须单独调用 sys.dm_exec_query_plan 以获取与用户定义函数对应的计划句柄。