1. 简介
在MSSQL数据库中进行了连接的数据库会话过程将增加数据库服务器的负荷。为了避免服务器的性能下降,应该查看数据库连接并及时断开不必要的连接。本文将介绍在MSSQL中查看数据库连接的最佳实践。
2. 查看当前连接数
要查看当前连接数,可以使用如下代码:
SELECT COUNT(*)
FROM sys.dm_exec_sessions
WHERE is_user_process = 1;
这个查询会返回当前所有的活动连接数。如果返回结果不是预想中的,请继续向下阅读以找到原因。
3. 查找SQL语句
如果要查找谁正在使用连接,可以使用如下代码:
SELECT *
FROM sys.dm_exec_connections c
JOIN sys.dm_exec_sessions s
ON c.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(c.most_recent_sql_handle)
WHERE s.is_user_process = 1;
这个查询会返回所有正在使用连接的SQL语句。可以使用ORDER BY子句对结果进行排序,例如,按CPU时间排序:
SELECT *
FROM sys.dm_exec_connections c
JOIN sys.dm_exec_sessions s
ON c.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(c.most_recent_sql_handle)
WHERE s.is_user_process = 1
ORDER BY s.cpu_time DESC;
这将按CPU时间倒序显示连接和相关的SQL语句。
4. 查找阻塞会话
要查找阻塞连接和会话,可以使用如下代码:
SELECT blocking_session_id,
wait_type,
wait_time,
wait_resource,
session_id,
db_name(database_id) AS db_name,
program_name,
login_name,
last_request_start_time,
last_request_end_time,
cpu_time,
total_elapsed_time,
reads,
writes,
logical_reads,
text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
WHERE blocking_session_id > 0;
这个查询将返回所有阻塞连接和会话。可以使用ORDER BY子句按阻塞时间排序,例如:
SELECT blocking_session_id,
wait_type,
wait_time,
wait_resource,
session_id,
db_name(database_id) AS db_name,
program_name,
login_name,
last_request_start_time,
last_request_end_time,
cpu_time,
total_elapsed_time,
reads,
writes,
logical_reads,
text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(sql_handle)
WHERE blocking_session_id > 0
ORDER BY wait_time DESC;
这将按阻塞时间倒序返回所有阻塞连接和会话。
5. 查找空闲连接
在某些情况下,会话可能会被创建,但未使用。这些会话会消耗数据库的资源。要查找空闲会话,请使用如下代码:
SELECT s.session_id,
s.login_name,
s.status,
s.last_request_start_time,
s.last_request_end_time,
s.cpu_time,
s.total_elapsed_time
FROM sys.dm_exec_sessions s
LEFT JOIN sys.dm_exec_requests r
ON s.session_id = r.session_id
WHERE r.session_id IS NULL
AND is_user_process = 1;
这个查询将返回所有空闲连接。空闲连接的last_request_start_time
和last_request_end_time
字段都将是NULL
。
6. 断开连接
要断开连接,请使用如下代码:
KILL session_id;
session_id
是要断开的连接的会话ID。可以使用前面提到的任何查询来找到会话ID。
7. 结论
使用本文中介绍的查询可查找MSSQL数据库中的连接,包括活动连接、SQL语句、阻塞连接和空闲连接。这些查询还可以用来断开连接。定期检查和回收不必要的连接将有助于提高MSSQL服务器的性能。