SELECT qps.query_plan,
st.text,
DB_NAME(st.dbid) DBName,
OBJECT_NAME(st.objectid) ObjectName,
cp.usecounts,
cp.size_in_bytes /1024 [Size in kB],
cp.objtype,
cp.cacheobjtype
FROM sys.dm_exec_cached_plans AS cp
CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st
CROSS APPLY sys.dm_exec_query_plan_stats(plan_handle) AS qps
WHERE st.encrypted = 0
AND DB_NAME(st.dbid) = 'AdventureWorks2016'
ORDER BY [Size in kB] DESC;
在 SQL Server 2019 之前,执行查询后不可能获得实际的执行计划。
从 SQL Server 2019+ 开始,该选项存在。
首先,您应该更改数据库范围配置。
此选项启用 sys.dm_exec_query_plan_stats 中最后一个实际执行计划的等效项(同样可以通过启用 TF 2451 来完成)。
查看更多关于ALTER DATABASE SCOPED CONFIGURATION (Transact-SQL)
而且您可以执行这样的查询以获得实际的执行计划。
结果如下图所示。
如果您运行的是 SQL Server 2012 或更高版本,则可以考虑创建一个扩展事件会话并将其配置为捕获query_post_execution_showplan事件,以便在执行查询后捕获实际执行计划。但显然,在执行查询之前需要设置和启用会话。
但是,请注意,启用此事件会影响性能,因此您可能希望出于调查目的打开此事件,然后在捕获您所追求的计划后再次关闭。