前言
做 SQL Server DBA,真正考验能力的不是会不会创建数据库,而是在生产环境出现 CPU 飙高、SQL 卡顿、阻塞堆积、日志暴涨、Always On 延迟时,能快速找到问题原因。
SQL Server 提供了大量 DMV(Dynamic Management Views)用于监控和诊断,这些 DMV 是 DBA 日常排障最重要的工具。
下面整理 100 条生产环境高频使用命令:
- SQL Server 日常巡检
- 性能问题定位
- 阻塞与锁分析
- SQL 优化
- 索引维护
- Always On
- 备份恢复
- 权限管理

适用于 SQL Server 2016 / 2017 / 2019 / 2022。
一、实例基础信息(1-10)
1. 查看 SQL Server 版本
SELECT @@VERSION;
2. 查看详细版本信息
SELECT
SERVERPROPERTY('ProductVersion') AS Version,
SERVERPROPERTY('ProductLevel') AS Level,
SERVERPROPERTY('Edition') AS Edition,
SERVERPROPERTY('EngineEdition') AS EngineEdition;
3. 查看实例名称
SELECT SERVERPROPERTY('ServerName');
4. 查看当前时间
SELECT GETDATE();
5. 查看 SQL Server 启动时间
SELECT sqlserver_start_time
FROM sys.dm_os_sys_info;
6. 查看服务器 CPU 和内存
SELECT
cpu_count,
physical_memory_kb/1024 AS memory_mb,
virtual_machine_type_desc
FROM sys.dm_os_sys_info;
7. 查看 SQL Server 最大内存配置
SELECT
name,
value_in_use
FROM sys.configurations
WHERE name='max server memory (MB)';
8. 查看当前数据库
SELECT DB_NAME();
9. 查看所有数据库状态
SELECT
name,
state_desc,
recovery_model_desc,
compatibility_level
FROM sys.databases;
10. 查看数据库创建时间
SELECT
name,
create_date
FROM sys.databases;
二、数据库空间管理(11-20)
11. 查看数据库文件
SELECT
DB_NAME(database_id) AS database_name,
name,
physical_name,
size*8/1024 AS size_mb
FROM sys.master_files;
12. 查看数据文件和日志文件
SELECT
DB_NAME(database_id) AS database_name,
name,
type_desc,
size*8/1024 AS size_mb
FROM sys.master_files;
13. 查看数据库大小排行
SELECT
DB_NAME(database_id) AS database_name,
SUM(size)*8/1024 AS size_mb
FROM sys.master_files
GROUP BY database_id
ORDER BY size_mb DESC;
14. 查看日志文件大小
SELECT
DB_NAME(database_id),
name,
size*8/1024 AS log_mb
FROM sys.master_files
WHERE type_desc='LOG';
15. 查看日志使用率
DBCC SQLPERF(LOGSPACE);
16. 查看数据库空间使用
EXEC sp_spaceused;
17. 查看最大表
SELECT TOP 20
OBJECT_NAME(object_id) AS table_name,
SUM(reserved_page_count)*8/1024 AS size_mb
FROM sys.dm_db_partition_stats
GROUP BY object_id
ORDER BY size_mb DESC;
18. 查看表行数
SELECT
OBJECT_NAME(object_id),
SUM(rows)
FROM sys.partitions
WHERE index_id IN (0,1)
GROUP BY object_id;
19. 查看文件增长设置
SELECT
name,
growth,
is_percent_growth
FROM sys.database_files;
20. 查看数据库恢复模式
SELECT
name,
recovery_model_desc
FROM sys.databases;
三、Session 与连接排查(21-35)
21. 查看当前连接
SELECT *
FROM sys.dm_exec_sessions;
22. 查看正在执行 SQL
SELECT
session_id,
status,
command,
cpu_time,
total_elapsed_time,
wait_type,
blocking_session_id
FROM sys.dm_exec_requests;
23. 查看完整 SQL 文本
SELECT
r.session_id,
t.text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle)t;
24. 查看活动用户连接
SELECT
login_name,
COUNT(*)
FROM sys.dm_exec_sessions
GROUP BY login_name;
25. 查看客户端来源
SELECT
host_name,
program_name,
login_name,
COUNT(*)
FROM sys.dm_exec_sessions
GROUP BY
host_name,
program_name,
login_name;
26. 查看长时间运行 SQL
SELECT
session_id,
start_time,
total_elapsed_time/1000 AS seconds,
command
FROM sys.dm_exec_requests
ORDER BY total_elapsed_time DESC;
27. 查看 CPU 消耗 Session
SELECT TOP 20
session_id,
cpu_time,
logical_reads
FROM sys.dm_exec_requests
ORDER BY cpu_time DESC;
28. 查看当前等待
SELECT
session_id,
wait_type,
wait_time,
blocking_session_id
FROM sys.dm_exec_requests
WHERE wait_type IS NOT NULL;
29. 查看阻塞 Session
SELECT
session_id,
blocking_session_id,
wait_type
FROM sys.dm_exec_requests
WHERE blocking_session_id<>0;
30. 查看完整阻塞链
SELECT
blocking_session_id,
session_id,
wait_type,
wait_time
FROM sys.dm_exec_requests
WHERE blocking_session_id > 0;
31. 查看空闲连接
SELECT
session_id,
status,
last_request_start_time
FROM sys.dm_exec_sessions
WHERE status='sleeping';
32. 杀掉 Session
KILL 57;
33. 查看连接限制
SELECT
name,
value_in_use
FROM sys.configurations
WHERE name='user connections';
34. 查看登录失败
EXEC xp_readerrorlog;
35. 查看当前等待事件排行
SELECT TOP 20
wait_type,
waiting_tasks_count,
wait_time_ms
FROM sys.dm_os_wait_stats
ORDER BY wait_time_ms DESC;
四、锁、事务与阻塞(36-50)
36. 查看当前锁
SELECT *
FROM sys.dm_tran_locks;
37. 查看打开事务
DBCC OPENTRAN;
38. 查看活动事务
SELECT *
FROM sys.dm_tran_active_transactions;
39. 查看长事务
SELECT
session_id,
transaction_id,
transaction_begin_time
FROM sys.dm_tran_session_transactions;
40. 查看锁等待
SELECT
request_session_id,
resource_type,
request_mode,
request_status
FROM sys.dm_tran_locks
WHERE request_status='WAIT';
41. 查看阻塞 SQL
SELECT
blocking_session_id,
session_id,
wait_type,
wait_time
FROM sys.dm_exec_requests
WHERE blocking_session_id<>0;
42. 查看死锁
SELECT *
FROM system_health.session_targets;
43. 查看隔离级别
DBCC USEROPTIONS;
44. 查看当前事务数量
SELECT
COUNT(*)
FROM sys.dm_tran_active_transactions;
45. 查看版本存储空间
SELECT *
FROM sys.dm_tran_version_store_space_usage;
46. 查看 TempDB 版本存储
SELECT *
FROM sys.dm_db_file_space_usage;
47. 查看锁数量
SELECT
COUNT(*)
FROM sys.dm_tran_locks;
48. 查看等待资源
SELECT
wait_type,
resource_description
FROM sys.dm_os_waiting_tasks;
49. 查看当前死锁监控
SELECT
*
FROM sys.dm_xe_sessions;
50. 强制结束阻塞
KILL session_id;
五、SQL 性能分析(51-65)
51. CPU 消耗最高 SQL
SELECT TOP 20
qs.total_worker_time,
qt.text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY qs.total_worker_time DESC;
52. 执行次数最高 SQL
SELECT TOP 20
execution_count,
text
FROM sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
ORDER BY execution_count DESC;
53. 平均耗时最高 SQL
SELECT TOP 20
total_elapsed_time/execution_count,
text
FROM sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
ORDER BY 1 DESC;
54. 查看缓存执行计划
SELECT *
FROM sys.dm_exec_cached_plans;
55. 查看执行计划
SET SHOWPLAN_XML ON;
GO
SELECT *
FROM table_name;
GO
SET SHOWPLAN_XML OFF;
56. 查看 Query Store
SELECT *
FROM sys.query_store_query;
57. 查询历史高耗 SQL
SELECT TOP 20
*
FROM sys.query_store_runtime_stats
ORDER BY avg_duration DESC;
58. 查看逻辑读最高 SQL
SELECT TOP 20
total_logical_reads,
text
FROM sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
ORDER BY total_logical_reads DESC;
59. 查看物理读最高 SQL
SELECT TOP 20
total_physical_reads,
text
FROM sys.dm_exec_query_stats
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
ORDER BY total_physical_reads DESC;
60. 查看缓存大小
SELECT
SUM(size_in_bytes)/1024/1024 AS MB
FROM sys.dm_exec_cached_plans;
六、索引与统计信息(66-80)
61. 查看索引
SELECT *
FROM sys.indexes;
62. 查看索引碎片
SELECT
OBJECT_NAME(object_id),
avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats
(
NULL,NULL,NULL,NULL,'LIMITED'
);
63. 重建索引
ALTER INDEX ALL
ON table_name
REBUILD;
64. 重组索引
ALTER INDEX ALL
ON table_name
REORGANIZE;
65. 更新统计信息
UPDATE STATISTICS table_name;
66. 查看缺失索引
SELECT *
FROM sys.dm_db_missing_index_details;
67. 查看索引使用情况
SELECT *
FROM sys.dm_db_index_usage_stats;
68. 查看未使用索引
SELECT *
FROM sys.dm_db_index_usage_stats
WHERE user_seeks=0
AND user_scans=0;
69. 查看统计信息更新时间
SELECT
name,
STATS_DATE(object_id,index_id)
FROM sys.indexes;
70. 创建索引
CREATE INDEX idx_name
ON table_name(column_name);
七、Always On 高可用(81-90)
71. 查看副本状态
SELECT *
FROM sys.dm_hadr_availability_replica_states;
72. 查看同步状态
SELECT *
FROM sys.dm_hadr_database_replica_states;
73. 查看同步延迟
SELECT
database_id,
log_send_queue_size,
redo_queue_size
FROM sys.dm_hadr_database_replica_states;
74. 查看 AG 配置
SELECT *
FROM sys.availability_groups;
75. 查看监听器
SELECT *
FROM sys.availability_group_listeners;
76. 查看 Replica
SELECT *
FROM sys.availability_replicas;
77. 查看同步健康状态
SELECT
synchronization_health_desc
FROM sys.dm_hadr_availability_replica_states;
八、备份恢复(91-97)
78. 查看备份历史
SELECT
database_name,
backup_start_date,
backup_finish_date,
type
FROM msdb.dbo.backupset
ORDER BY backup_finish_date DESC;
79. 备份数据库
BACKUP DATABASE dbname
TO DISK='D:\backup\db.bak';
80. 备份日志
BACKUP LOG dbname
TO DISK='D:\backup\db.trn';
81. 恢复数据库
RESTORE DATABASE dbname
FROM DISK='D:\backup\db.bak';
82. 查看最近备份
SELECT TOP 10 *
FROM msdb.dbo.backupset
ORDER BY backup_finish_date DESC;
83. 查看恢复历史
SELECT *
FROM msdb.dbo.restorehistory;
九、权限管理(98-100)
84. 查看登录账户
SELECT *
FROM sys.server_principals;
85. 查看数据库用户
SELECT *
FROM sys.database_principals;
86. 查看权限
SELECT *
FROM sys.database_permissions;
87. 创建登录
CREATE LOGIN user1
WITH PASSWORD='Password@123';
88. 创建数据库用户
CREATE USER user1
FOR LOGIN user1;
89. 授权读取
ALTER ROLE db_datareader
ADD MEMBER user1;
90. 授权写入
ALTER ROLE db_datawriter
ADD MEMBER user1;
91. 删除用户
DROP USER user1;
92. 删除登录
DROP LOGIN user1;
十、DBA 日常巡检补充(93-100)
93. 查看 SQL Agent 状态
SELECT *
FROM msdb.dbo.sysjobs;
94. 查看失败 Job
SELECT *
FROM msdb.dbo.sysjobhistory
WHERE run_status<>1;
95. 查看错误日志
EXEC xp_readerrorlog;
96. 查看 TempDB 使用
SELECT *
FROM sys.dm_db_file_space_usage;
97. 查看内存压力
SELECT *
FROM sys.dm_os_memory_clerks;
98. 查看 CPU 压力
SELECT *
FROM sys.dm_os_schedulers;
99. 查看 IO 延迟
SELECT *
FROM sys.dm_io_virtual_file_stats(NULL,NULL);
100. 查看 SQL Server 等待统计
SELECT TOP 20
wait_type,
wait_time_ms
FROM sys.dm_os_wait_stats
ORDER BY wait_time_ms DESC;
总结
SQL Server DBA 的核心能力,不是记住多少 T-SQL,而是面对生产问题时能够建立正确的排查路径。
例如:
- CPU 高 → 不应该先看 CPU,而应该看等待和高耗 SQL;
- 数据库慢 → 不应该马上加索引,而应该分析执行计划;
- 日志暴涨 → 不应该直接扩容,而应该检查事务、备份链和恢复模式;
- Always On 延迟 → 不应该只看延迟秒数,而应该分析日志发送队列和 redo 队列。
真正成熟的 SQL Server DBA,掌握的是这些命令背后的诊断逻辑。
这篇和前面的 MySQL、PostgreSQL 可以形成你的 《DBA 三大数据库 100 条命令系列》。建议后续补一篇 Oracle DBA 实用 100 条命令,这个系列完整度会更高。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




