视图本身无执行计划,需查查询视图的语句;可用ssms实际执行计划、set statistics xml或从缓存提取dmv三种方式获取,并结合xml中estimaterows与actualrows差异及操作符(如key lookup、table scan)分析性能问题。

视图本身没有执行计划,只有查询视图的语句才有执行计划。 所以你真正要查的,是“执行 SELECT * FROM your_view 这类语句时,SQL Server 实际怎么走的”。直接对视图对象右键、双击或用 sp_helptext 看定义,都看不到执行计划——那只是 T-SQL 文本,不是运行时行为。
用 SSMS 图形界面看实际执行计划(最常用)
这是开发和调试阶段最直观的方式,适用于单次执行、可复现的查询:
- 在 SQL Server Management Studio 查询编辑器中写好语句,比如
SELECT * FROM dbo.vw_customer_summary - 点击工具栏上的 “包括实际的执行计划” 按钮(快捷键
Ctrl+M),再按F5执行 - 执行完成后,切换到下方的 “执行计划” 选项卡,看到的就是该语句的真实执行路径
- 注意:必须执行语句才会生成 实际执行计划;如果只点 “显示估计的执行计划”(
Ctrl+L),它不访问数据,也不触发统计信息更新,对参数嗅探敏感的视图可能给出误导性结果
用 SET STATISTICS XML 查看 XML 执行计划(适合自动化或日志留存)
当你要把执行计划保存下来分析、或集成进脚本/监控流程时,这个方式更可控:
- 在语句前加
SET STATISTICS XML ON;,执行后会在“消息”选项卡旁多出一个“执行计划”结果集,内容是完整 XML - XML 中的
<relop></relop>节点描述每个物理操作(如Index Seek、Hash Match),EstimateRows和ActualRows的差异能暴露统计信息陈旧问题 - 关闭开关用
SET STATISTICS XML OFF;,避免影响后续语句输出 - ⚠️ 不要在生产环境长期开启,它会轻微增加 CPU 开销;也别在循环里反复开/关,容易干扰结果集顺序
从缓存中提取已执行视图查询的计划(排查历史慢查询)
如果你没在执行时主动捕获,但语句刚跑过且还在计划缓存里,可以用动态管理视图捞出来:
- 先查出对应语句的
plan_handle:SELECT TOP 1 plan_handle, st.text FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st WHERE st.text LIKE '%vw_customer_summary%'
- 再用
sys.dm_exec_query_plan提取 XML:SELECT query_plan FROM sys.dm_exec_query_plan(0x06000500...); -- 替换为上一步拿到的 plan_handle
- ⚠️ 计划可能已被踢出缓存(例如执行了
DBCC FREEPROCCACHE或内存压力大),query_plan字段返回NULL就说明找不到了 - 视图嵌套深时,XML 里会出现多个
<stmtsimple></stmtsimple>,注意区分哪一段对应你的外层SELECT
真正难的不是“怎么点出来”,而是看懂那些图标和数字——比如 Key Lookup 配合高 Actual Rows 基本等于索引设计缺陷,Table Scan 出现在大表上却没走任何索引,大概率是视图里用了函数包裹字段(如 WHERE UPPER(name) = 'ABC')导致索引失效。这些细节藏在执行计划里,但不会自动告诉你“该加什么索引”,得结合表结构和谓词手工推演。










