You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动