使用MSSQL进行进程查询的方法

什么是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数据库的性能非常有用。

数据库标签