SQL Server特定视图统计未录入sys.dm_db_index_usage_stats问题咨询
问题1:特定视图未生成使用统计的原因
sys.dm_db_index_usage_stats 本身存储的是数据库中实体索引、基表的访问统计数据,不会直接记录普通视图的使用记录,你看到的部分视图有统计本质是以下两个前提同时满足:
- 这些视图是索引视图(物化视图):创建了唯一聚集索引的视图会有实体化的物理存储结构,对应自己的索引元数据,访问时命中视图索引就会生成该视图object_id对应的统计记录
- 你的查询关联逻辑存在疏漏:你当前仅用
OBJECT_NAME(tst.object_id) = t.TABLE_NAME关联,没有匹配schema,很容易出现同表名不同schema的错误匹配,部分看起来匹配到的视图统计实际是同名称基表的统计
你提到的无统计的特定视图,核心原因是属于普通非索引视图:普通视图是虚拟表,执行查询时会被SQL Server展开为对基表的查询,访问统计只会落到依赖的基表、基表索引上,不会生成视图自身object_id对应的sys.dm_db_index_usage_stats记录。如果该视图是跨库视图,基表的统计还会存储在源库的动态视图中,当前库更不会生成相关记录。
问题2:统计获取方案
方案1:让视图统计写入sys.dm_db_index_usage_stats
给该视图创建唯一聚集索引转为索引视图即可,访问时如果命中视图的索引,就会生成对应统计记录。注意索引视图有严格的语法限制:
- 视图定义必须使用
SCHEMABINDING绑定 schema - 不能包含
OUTER JOIN、UNION、子查询、非确定性函数等语法 - 聚合类视图必须包含
COUNT_BIG(*)字段
方案2:不改视图结构获取使用统计
用SQL Server自带的*查询存储(Query Store)*统计即可,SQL Server 2016及以上版本默认开启,可通过以下查询获取指定视图的访问记录:
SELECT qt.query_sql_text, qs.last_execution_time, qs.count_executions, qs.total_duration / 1000 AS total_duration_ms FROM sys.query_store_query q JOIN sys.query_store_query_text qt ON q.query_text_id = qt.query_text_id JOIN sys.query_store_plan p ON q.query_id = p.query_id JOIN sys.query_store_runtime_stats qs ON p.plan_id = qs.plan_id WHERE qt.query_sql_text LIKE N'%你的视图名称%' -- 替换为实际视图名 ORDER BY qs.last_execution_time DESC
你也可以根据需要扩展字段,统计访问频率、读写开销等维度的数据。
内容的提问来源于stack exchange,提问作者NodeSa
相关产品推荐
相关产品推荐

