什么是MSSQL?
MSSQL,全称为Microsoft SQL Server,是微软公司开发的一款关系型数据库管理系统,常被用于高负载、大规模企业级应用。MSSQL提供了广泛的功能和工具,轻松支持企业中的强大数据库需求。MSSQL不仅仅是关系型数据库管理系统,更是一套集成管理工具、报表生成工具、数据仓库、ETL等一体化大数据方案。
进程查询的概念
在MSSQL中,一个进程是一个单独的任务或者一组任务。在SQL Server中,每个进程是由一个线程组成的,线程又由系统调度单元调度。
进程查询是通过查询MSSQL系统表sys.dm_exec_requests和sys.dm_exec_sessions等来获取实时进程信息和会话信息的过程。
查询活动进程
查询活动进程步骤
以下是使用MSSQL进行查询活动进程的步骤:
打开SQL Server Management Studio。
连接要查询的数据库实例。
在查询编辑器中键入以下T-SQL语句:
SELECT
session_id,
blocking_session_id,
is_user_process,
status,
command,
wait_type,
statement_start_offset/2 as statement_start_offset,
COALESCE(nullif(LEN(RTRIM(text)) - LEN(REPLACE(RTRIM(text), CHAR(13), '')),0),1) as RowsNumber,
COALESCE(nullif(LEN(RTRIM(text)) - LEN(REPLACE(RTRIM(text), CHAR(10), '')),0),1) as LinesNumber,
COALESCE(nullif(LEN(RTRIM(text)),0),1) as LengthText,
cpu_time,
total_elapsed_time/1000.0 as total_elapsed_time, --convert milliseconds to sec
read_operations,
writes_operations,
logical_reads,
physical_reads,
wait_time,
wait_resource,
last_wait_type,
program_name,
host_name,
login_name
FROM sys.dm_exec_requests
CROSS APPLY sys.dm_exec_sql_text (sql_handle)
WHERE session_id != @@SPID
查询活动进程结果解析
执行以上命令后,将返回所有活动进程的详细信息。
session_id - 进程的唯一标识符。
blocking_session_id - 阻止当前进程执行的进程id,如果没有被阻塞,则为0。
is_user_process - 标记进程是系统进程还是用户进程。0表示是一个系统进程;1表示是一个用户进程。
status - 进程的状态。
command - 执行的操作。
wait_type - 导致进程等待的事件类型。
statement_start_offset - 查询语句的开始偏移量,以字节为单位。
RowsNumber - 查询语句的行数。
LinesNumber - 查询语句的行数。
LengthText - 查询语句的长度。
cpu_time - 进程使用的CPU时间。
total_elapsed_time - 进程运行的总时间(毫秒)。
read_operations - 读取操作的数量。
writes_operations - 写入操作的数量。
logical_reads - 逻辑读取的数量。
physical_reads - 物理读取的数量。
wait_time - 进程等待事件的总时间(毫秒)。
wait_resource - 导致进程等待的资源。
last_wait_type - 进程最后等待的事件类型。
program_name - 此进程所属的应用程序名称。
host_name - 进程所在的计算机的名称。
login_name - 进程所属的登录名称。
查询阻塞进程
查询阻塞进程步骤
以下是使用MSSQL进行查询阻塞进程的步骤:
打开SQL Server Management Studio。
连接要查询的数据库实例。
在查询编辑器中键入以下T-SQL语句:
SELECT
L.request_session_id AS SPID,
DB_NAME(L.resource_database_id) AS DatabaseName,
O.Name AS LockedObjectName,
P.object_id AS LockedObjectId,
L.resource_type AS LockedResource,
L.request_mode AS LockType,
ST.text AS SqlStatementText,
ES.login_name AS LoginName,
ES.host_name AS HostName,
TST.is_user_transaction as transaction_type,
AT.name as tran_name,
CN.auth_scheme as auth_scheme,
L.request_status AS RequestStatus,
L.request_owner_type AS RequestOwnerType,
L.request_mode + ' + ' + L.request_type AS LockRequestType,
nullif(L.request_duration,0) as RequestDuration,
L.request_session_id,
DB_NAME(L.resource_database_id) database_name,
O.name as object_name
FROM sys.dm_tran_locks L
JOIN sys.partitions P
ON P.hobt_id = L.resource_associated_entity_id
JOIN sys.objects O
ON O.object_id = P.object_id
JOIN sys.dm_exec_sessions ES
ON ES.session_id = L.request_session_id
JOIN sys.dm_exec_connections CN
ON CN.session_id = ES.session_id
JOIN sys.dm_tran_session_transactions TST
ON ES.session_id = TST.session_id
JOIN sys.dm_tran_active_transactions AT
ON TST.transaction_id = AT.transaction_id
CROSS APPLY sys.dm_exec_sql_text(CN.most_recent_sql_handle) AS ST
WHERE
-- 过滤非阻塞进程
L.request_status <> 'granted'
查询阻塞进程结果解析
执行以上命令后,将返回阻止其它进程运行的所有阻塞进程的详细信息。
SPID - 阻塞进程id。
DatabaseName - 阻塞进程所在的数据库名称。
LockedObjectName - 阻塞对象的名称。
LockedObjectId - 阻塞对象的ID。
LockedResource - 阻塞的资源类型。
LockType - 阻塞进程的锁定模式。
SqlStatementText - 阻塞进程执行的SQL语句。
LoginName - 阻塞进程所属的登录名称。
HostName - 阻塞进程所在计算机的名称。
transaction_type - 事务类型。
tran_name - 事务名称。
auth_scheme - 认证方案。
RequestStatus - 请求状态。
RequestOwnerType - 请求所有者类型。
LockRequestType - 锁请求类型。
RequestDuration - 请求持续时间。
request_session_id - 请求进程的id。
object_name - 阻塞对象的名称。
总结
使用MSSQL进行进程查询是获取实时进程信息和会话信息的一种方法。使用sys.dm_exec_requests和sys.dm_exec_sessions等系统表,可以获得有关进程的广泛信息。查询活动进程可以获得现有进程的详细信息。查询阻塞进程可以获得阻塞其他进程的详细信息。这些查询对于监视和优化MSSQL数据库的性能非常有用。