本篇文章主要介绍了" 译:为什么会从sysdm_exec_query_plan中得到query_plan为NULL的结果",主要涉及到方面的内容,对于SqlServer感兴趣的同学可以参考一下:
背景:在面对生产环境的数据的异常问题诊断的时候,比如接到异常告警邮件,通常是CPU居高不下、长时间连续大批量发生物理IO(导致系统响应缓慢)、亦或是大量Ses...
背景:
在面对生产环境的数据的异常问题诊断的时候,比如接到异常告警邮件,
通常是CPU居高不下、长时间连续大批量发生物理IO(导致系统响应缓慢)、亦或是大量Session被阻塞或者大量session执行超出预期等等类似情况,
笔者习惯性地利用sys.dm_exec_requests 和 sys.dm_exec_sql_text(sql_handle) t 以及sys.dm_exec_query_plan(plan_handle) 三个系统表去观察当前数据库正在运行哪些Session,
执行的批处理或者存储过程是哪个,正在执行批处理或者存储过程中的哪个sql语句,是否遇到到了阻塞,当前session的运行状态,等待的资源是什么,sql语句是怎么执行的(执行计划),
以及在有参数的情况下,执行计划编译的参数等等信息。
获取实时Session运行的sql语句的执行计划是非常重要的参考信息之一,偶尔会发现一些正在执行的存储过程的执行计划为null(从sys.dm_exec_query_plan中查询的),
这样的话,得到的参考信息有限,不利于问题的诊断和解决。
参考下图:

在网上发现一篇有对此问题分析的文章,觉的写的很好,原文出处:https://blogs.msdn.microsoft.com/psssql/2016/07/13/why-am-i-getting-null-values-for-query_plan-from-sys-dm_exec_query_plan/。
另外:
不仅仅在查询缓存执行计划的时候存在该问题,
sys.dm_exec_query_plan返回的是整个批处理中所有的语句的执行计划,只要任何一个SQL语句的执行计划没有生成,返回的批处理的执行计划就为null
对于实时运行的SQL(批处理或者存储过程),如果是第一次运行或者是类似于作业任务执行频率很低的sql(其执行计划缓存被清理),在真正运行之前的时候,
某些语句中存在临时表的情况下,不会对所有语句进行预编译(也就是完整地编译整个批处理),因此利用sys.dm_exec_query_plan查询的时候,是无法获取当前Session运行的批处理的执行计划的。
对于这种情况,可以利用sys.dm_exec_text_query_plan 这个系统视图,可以得到批处理中语句级的执行计划。
以下为译文:
最近我接到一个用户打来的电话,想知道为什么他会从 sys.dm_exec_query_plan中到NULL值的执行计划,这个客户参考了从 https://dzone.com/articles/dmexecqueryplan-returning-null参考了一篇本文,
在那个场景中,如果语句包含了临时表,并且没有被执行过,你会得到一个NULL之的执行计划。
参考如下代码: