动态管理视图 [DMV] – SQL Server 2005 功能






4.94/5 (26投票s)
DMV 是 SQL Server 2005 中新引入的功能,它向数据库管理员提供有关 SQL Server 机器当前状态的信息。
引言
DMV 是 SQL Server 2005 中新引入的功能,它向数据库管理员提供有关 SQL Server 机器当前状态的信息。这些值将帮助管理员诊断问题并优化服务器以获得最佳性能。DMV 旨在替代 SQL Server 2000 中提供的系统表和各种其他功能。在本文中,我将只解释常用的 DMV。
两种类型的动态管理视图
- 服务器范围的 DMV:存储在 Master 数据库中
- 数据库范围的 DMV:特定于每个数据库
执行 DMV 的权限 [安全]
要查询服务器范围的 DMV,数据库用户必须对 VIEW SERVER STATE
具有 SELECT
权限;对于数据库范围的 DMV,用户必须对 VIEW DATABASE STATE
具有 SELECT
权限。
- GRANT VIEW SERVER STATE to <Login>
- GRANT VIEW DATABASE STATE to <User>
如果您想拒绝用户查询某些 DMV 的权限,您可以使用 DENY
命令限制对特定 DMV 的访问。
入门
所有 DMV 都存在于 SYS 架构中,它们的名称以 DM_
开头。因此,当您需要查询 DMV 时,您应该在视图名称前加上 SYS
。例如,如果您需要查看 SQL Server 机器的总物理内存;那么执行下面的 TSQL 命令
SELECT
(Physical_memory_in_bytes/1024.0)/1024.0 AS Physical_memory_in_Mb
FROM
sys.dm_os_sys_info
在本文中,我将解释一些可以经常使用的 DMV,以了解 SQL Server 的当前行为
- SQL Server 相关 [硬件资源] DMV
- 数据库相关 DMV
- 索引相关 DMV
- 执行相关 DMV
1. SQL Server 相关 DMV
本节详细介绍与 SQL Server 系统相关的 DMV。SQL DMV 负责管理特定于 SQL Server 实例的服务器级别资源。
本节涵盖与操作系统、磁盘和内存相关的 DMV。
a. sys.dm_os_sys_info
此视图返回有关 SQL Server 机器、可用资源和资源消耗的信息。
此视图返回以下信息
- CPU 计数:服务器中的逻辑 CPU 数量
- 超线程比:逻辑 CPU 和物理 CPU 的比率
Physical_memory_in_bytes
:可用物理内存量Virtual_memory_in_bytes
:可用虚拟内存量Bpool_commited
:缓冲池中已提交的物理内存OS_Priority_class
:SQL Server 进程的优先级类别Max_workers_thread
:可以创建的最大工作线程数
b. sys.dm_os_hosts
此视图返回在 SQL Server 2005 中注册的所有主机。此视图还提供每个主机使用的资源。
Name
:注册的主机名称Type
:托管组件的类型 [SQL Native Interface/OLE DB/MSDART]Active_tasks_count
:主机放置的活动任务数Active_ios_count
:主机等待的 I/O 请求数
c. sys.dm_os_schedulers
Sys.dm_os_schedulers
视图将帮助您识别 SQL Server 机器中是否存在任何 CPU 瓶颈。可运行任务的数量通常是非零值;非零值表示任务必须等待它们的时间片才能运行。如果可运行任务计数显示高值,则表明存在 CPU 瓶颈。
SELECT
scheduler_id,current_tasks_count,runnable_tasks_count
FROM sys.dm_os_schedulers
WHERE scheduler_id < 255
上述查询将列出 SQL Server 机器中所有可用的调度程序以及每个调度程序的可运行任务数。
d. sys.dm_io_pending_io_requests
此动态视图将返回 SQL Server 端挂起的 I/O 请求。它为您提供以下信息
Io_type
:挂起的 I/O 请求类型Io_pending
:指示 I/O 请求是挂起还是已由 Windows 完成Scheduler_address
:发出此 I/O 请求的调度程序
e. sys.dm_io_virtual_file_stats
此视图返回数据和日志文件 [MDF 和 LDF 文件] 的 I/O 统计信息。此视图是常用视图之一,将帮助您识别 I/O 文件级别。它将返回以下信息
Sample_ms
:自 SQL Server 实例启动以来的毫秒数Num_of_reads
:文件上发出的读取次数Num_of_bytes_read
:此文件上读取的总字节数Io_stall_read_ms
:用户等待文件上发出的读取的总时间(以毫秒为单位)Num_of_writes
:此文件上的写入次数Num_of_bytes_written
:写入文件的总字节数Io_stall_write_ms
:用户等待文件上写入完成的总时间(以毫秒为单位)Io_stall
:用户等待 I/O 完成的总时间(以毫秒为单位)Size_on_disk_bytes
:此文件在磁盘上使用的字节数
f. sys.dm_os_memory_clerks
此 DMV 将帮助了解 SQL Server 通过 AWE 分配了多少内存。
SELECT
SUM(awe_allocated_kb) / 1024 as [AWE allocated, Mb]
FROM sys.dm_os_memory_clerks
可以使用相同的 DMV 获取 SQL Server 2005 内部组件的内存消耗。
SELECT TOP 10 type,
SUM(single_pages_kb) as [SPA Mem, Kb]
FROM sys.dm_os_memory_clerks
GROUP BY type
ORDER BY SUM(single_pages_kb) DESC
g. sys.dm_os_ring_buffers
此 DMV 使用 RING_BUFFER_RESOURCE_MONITOR
并提供来自资源监视器通知的信息,以识别内存状态变化。在内部,SQL Server 有一个框架来监视不同的内存压力。当内存状态改变时,资源监视器任务会生成一个通知。此通知由组件内部使用,以根据内存状态调整其内存使用情况。
SELECT
Record FROM sys.dm_os_ring_buffers
WHERE ring_buffer_type = 'RING_BUFFER_RESOURCE_MONITOR'
上述查询的输出将是 XML 格式。输出将帮助您检测任何低内存通知。
RING_BUFFER_OOM
:环形缓冲区 OOM 包含指示服务器内存不足情况的记录。
SELECT
record FROM sys.dm_os_ring_buffers
WHERE ring_buffer_type = 'RING_BUFFER_OOM'
2. 数据库相关 DMV
本节详细介绍与 SQL Server 数据库相关的 DMV。这些 DMV 将帮助识别数据库空间使用情况、分区使用情况、会话信息使用情况等...
a. sys.dm_db_file_space_usage
此 DMV 提供 TEMPDB
数据库的空间使用信息。
b. sys.dm_db_session_space_usage
此 DMV 提供每个会话为数据库分配和释放的页数
c. sys.dm_db_partition_stats
此 DMV 为当前数据库中的每个分区提供页和行计数信息。
下面的查询显示 MSDB 数据库中所有索引和堆的所有分区的计数
USE MSDB;
GO
SELECT * FROM sys.dm_db_partition_stats;
以下查询显示备份集表及其索引的所有分区的计数
USE MSDB
GO
SELECT * FROM sys.dm_db_partition_stats
WHERE object_id = OBJECT_ID('backupset');
d. sys.dm_os_performance_counters
返回服务器维护的 SQL Server / 数据库相关计数器。
下面的示例查询使用 dm_os_performance_counters
DMV 以 KB 为单位获取所有数据库的日志文件使用情况。
SELECT instance_name
,cntr_value 'Log File(s) Used Size (KB)'
FROM sys.dm_os_performance_counters
WHERE counter_name = 'Log File(s) Used Size (KB)'
3. 索引相关 DMV
本节详细介绍与 SQL Server 数据库相关的 DMV。这些 DMV 将帮助识别数据库空间使用情况、分区使用情况、会话信息使用情况等。
a. sys.dm_db_index_usage_stats
此 DMV 用于获取所有数据库中所有对象的索引使用情况的有用信息。它还显示每个索引的查找和扫描量。
SELECT object_id, index_id, user_seeks, user_scans, user_lookups
FROM sys.dm_db_index_usage_stats
ORDER BY object_id, index_id
可以使用以下查询识别数据库中迄今未使用的所有索引
SELECT object_name(i.object_id),
i.name,
s.user_updates,
s.user_seeks,
s.user_scans,
s.user_lookups
from sys.indexes i
left join sys.dm_db_index_usage_stats s
on s.object_id = i.object_id and
i.index_id = s.index_id and s.database_id = 5
where objectproperty(i.object_id, 'IsIndexable') = 1 and
s.index_id is null or
(s.user_updates > 0 and s.user_seeks = 0
and s.user_scans = 0 and s.user_lookups = 0)
order by object_name(i.object_id)
将 Database_id
替换为您正在查看的数据库。
4. 执行相关 DMV
执行相关的 DMV 将提供有关会话、连接以及进入 SQL Server 的各种请求的信息。
a. sys.dm_exec_sessions
此 DMV 将提供有关连接到 SQL Server 的每个会话的信息。此 DMV 类似于运行 sp_who2
或查询 Master..sysprocesses
表。
SELECT
session_id,login_name,
last_request_end_time,cpu_time
FROM sys.dm_exec_sessions
WHERE session_id >= 51 – All user Sessions
b. sys.dm_exec_connections
此 DMV 显示所有连接到 SQL Server 的连接。下面的查询使用 sys.dm_exec_connections
DMV 获取连接信息。此视图为每个用户连接返回一行 (Sessionid >= 51
)。
SELECT
connection_id,
session_id,client_net_address,
auth_scheme
FROM sys.dm_exec_connections
c. sys.dm_exec_requests
此 DMV 将详细说明每个连接在 SQL Server 中实际执行的操作。
SELECT
session_id,status,
command,sql_handle,database_id
FROM sys.dm_exec_requests
WHERE session_id >= 51
d. sys.dm_exec_sql_text
此动态管理函数返回给定 SQL 句柄的 SQL 语句文本。
SELECT
st.text
FROM
sys.dm_exec_requests r
CROSS APPLY
sys.dm_exec_sql_text(sql_handle) AS st
WHERE r.session_id = 51
结论
SQL Server 2005 中的动态管理视图 (DMV) 和动态管理函数 (DMF) 提供了一个透明的视图,可以看到 SQL Server 各个区域内部正在发生什么。通过使用它们,我们将能够以更有效的方式查询系统以获取其当前状态的信息,并更快地提供解决方案。DMV 可用于性能调优以及服务器和查询的故障排除。本文概述了它们是什么以及我们如何使用它们。