SQL Server数据库范围DM视图的查询方式及存储位置咨询
关于Database-Scoped动态管理视图(DMV)的存储位置与查询方法
先直接给你核心信息,再展开细节:
- 存储位置:Database-Scoped DMV 并非集中存放,而是每个SQL Server数据库(用户库、msdb、tempdb等所有系统库)的
sys架构下都有一套,作用范围仅限所在数据库。 - Server-Scoped DMV对比:这类仅存在于
master库的sys架构下,返回实例级全局数据。
如何列出Database-Scoped DMV
方法1:查询当前数据库的DMV
切换到你要查看的数据库后,运行这条SQL就能列出所有系统自带的Database-Scoped DMV:
SELECT SCHEMA_NAME(v.schema_id) AS [架构名], v.name AS [DMV名称], v.create_date AS [创建时间], v.modify_date AS [修改时间] FROM sys.views v INNER JOIN sys.schemas s ON v.schema_id = s.schema_id WHERE s.name = 'sys' AND v.name LIKE 'dm_%' AND v.is_ms_shipped = 1;
is_ms_shipped = 1是为了过滤掉用户自定义的同名视图,确保只返回系统原生的DMV。
方法2:批量查询所有在线数据库的DMV
如果要一次性查看所有在线数据库里的这类视图,可以用动态SQL遍历实现:
DECLARE @dynamicSQL NVARCHAR(MAX) = N''; SELECT @dynamicSQL += N' SELECT ''' + name + ''' AS [数据库名], SCHEMA_NAME(v.schema_id) AS [架构名], v.name AS [DMV名称] FROM ' + QUOTENAME(name) + '.sys.views v INNER JOIN ' + QUOTENAME(name) + '.sys.schemas s ON v.schema_id = s.schema_id WHERE s.name = ''sys'' AND v.name LIKE ''dm_%'' AND v.is_ms_shipped = 1;' FROM sys.databases WHERE state = 0; EXEC sp_executesql @dynamicSQL;
快速区分两类DMV的小技巧
一般来说,Database-Scoped DMV的名称会带有dm_db_前缀(比如sys.dm_db_index_usage_stats),而Server-Scoped的则是dm_开头但不含db_(比如sys.dm_os_sys_info)。不过这只是经验规律,还是推荐用上面的查询方法来精准区分。
内容的提问来源于stack exchange,提问作者Veera V




