Jos*_*ell 6 sql-server execution-plan plan-cache sql-server-2016
我试图了解 SQL Server 2016 SP3 系统上缓存元数据的一些执行计划,但我无法将我所看到的内容与文档相一致。
文档sys.dm_exec_cached_plans
说它包含:
SQL Server 缓存每个查询计划的一行,以加快查询执行速度。
在我正在观察的系统上,该视图现在有 41,283 行。其中绝大多数(37,594 行)是cacheobjtype =“Compiled Plan”和objtype =“Adhoc”。
文档sys.dm_exec_query_stats
说它包含:
缓存计划中每个查询语句一行,行的生命周期与计划本身相关。当从缓存中删除计划时,相应的行将从该视图中删除。
我预计此视图中至少有 37,594 行(每个缓存计划一个,如果某些缓存计划有多个语句,则可能更多)。但是,该视图总共有 6,867 行。
这种差异是如此之大,以至于我必须假设我误解了这些视图中应该包含的内容。
sys.dm_exec_query_stats
有人可以帮助我理解为什么与 相比 的行数如此之少吗sys.dm_exec_cached_plans
?
我尝试在 上将表内部连接在一起plan_handle
,唯一的匹配是 1:1 - 换句话说,有数以万计的缓存计划,没有“查询统计”行。
我还认为差异可能是由sys.dm_exec_procedure_stats
或中的许多行来解释的sys.dm_exec_trigger_stats
,但事实并非如此(分别为 93 行和 2 行)。
对于任何对这个问题的“为什么”感到好奇的人,我试图查看缓存中的各种计划有多旧,并且我不确定除了加入和sys.dm_exec_query_stats
检查之外还有什么方法可以做到这一点creation_time
。
以下是我用来获取上面引用的数字的查询:
-- total cached plans
SELECT COUNT_BIG(*) AS total_cached_plans
FROM sys.dm_exec_cached_plans decp
-- totals by type
SELECT decp.cacheobjtype, decp.objtype, COUNT_BIG(*) AS plan_count
FROM sys.dm_exec_cached_plans decp
GROUP BY decp.cacheobjtype, decp.objtype
ORDER BY decp.cacheobjtype, decp.objtype;
-- total query stats
SELECT COUNT_BIG(*) AS total_query_stats
FROM sys.dm_exec_query_stats;
Run Code Online (Sandbox Code Playgroud)
这些查询绝大多数是非参数化的用户查询,而不是系统查询。我通过按 SQL 文本(从 中提取sys.dm_exec_sql_text
)排序来验证这一点。一些例子:
这些都是连接到该服务器的应用程序提交的合法查询。
您的许多查询都符合简单参数化的条件。
SQL Server 创建该语句的参数化版本并将其缓存为准备好的计划。
您看到的临时计划只是指向参数化版本的外壳。
中的条目sys.dm_exec_query_stats
仅与准备好的计划相关联。
有关更多背景信息,请参阅我的文章“简单参数化和琐碎计划”。
归档时间: |
|
查看次数: |
878 次 |
最近记录: |