用途:获取 Azure SQL Database 的执行计划(估计或实际),并只提取解释慢查询所需的关键事实,如算子、估计行数与实际行数。
主要能力:区分估计计划与实际计划。SET SHOWPLAN_XML ON 只返回估计计划且不执行查询;SET STATISTICS XML ON 返回实际计划并在每个算子上带 ActualRows,但会真实执行查询。sys.dm_exec_query_plan 只返回估计计划,即使查询已运行多次也不含 ActualRows;sys.dm_exec_query_plan_stats 返回上次执行的实际计划,但需先开启数据库范围配置 LAST_QUERY_PLAN_STATS(默认 OFF,关闭时静默返回零行);sys.dm_exec_query_statistics_xml 可取正在运行查询的实际计划;sys.query_store_plan 配合 sys.query_store_runtime_stats 提供持久化的实际计划与聚合统计。
使用方式:SET SHOWPLAN 语句必须是批处理中唯一语句,且不能用于存储过程内,否则整批以 Msg 1067 失败。取上次实际计划需执行 ALTER DATABASE SCOPED CONFIGURATION SET LAST_QUERY_PLAN_STATS = ON; 再按 object_id 查询。提取 XML 时需先 SET QUOTED_IDENTIFIER ON,否则 .nodes()、.value()、.exist() 会报 Msg 1934。建议在服务端用 XQuery 只取小部分字段,避免粘贴完整计划 XML。
适用场景:排查查询变慢、比较估计与实际行数、查看警告、缺失索引提示与内存授予信息。
限制:需要 SHOWPLAN 与 VIEW DATABASE STATE 权限,Basic、S0、S1 和弹性池数据库还需 ##MS_ServerStateReader##。query_plan 在 128 层嵌套时返回 NULL,可用 sys.dm_exec_text_query_plan 替代;简单参数化查询可能只返回语句文本或仅根节点;批量操作和超过 8 KB 字符串字面量的语句不会被缓存。不得把估计行数当作实际发生值,不得把 MissingIndexes 提示当作建索引指令。