返回
软件
分类

会话正在运行一个后台任务

日期: 2020-04-22 04:33 浏览次数 : 107

在SQLSERVER中每个会话,即每个查询分析器窗口都会产生一个SQL进程,对于那些持续时间短的进程,它们转瞬即失,而对于持续时间比较长的,我们需要希望查看它的运行状态,就可以借助SQL提供的sp_who命令,下面是对它的具体介绍,主要选自MSDN.

方法一:

sp_who [ [ @loginame = ] 'login' | session ID | 'ACTIVE' ]你可以在sp_who后面加你的SPID号(sessionID),登陆名,线程状态等

SELECT * FROM 
[Master].[dbo].[SYSPROCESSES] WHERE [DBID] 
IN 
(
  SELECT 
   [DBID]
  FROM 
   [Master].[dbo].[SYSDATABASES] 
  WHERE 
   NAME='escm2'
)

下面对status执行状态作一个简单的说明,选自MSDN

方法二: 执行 SP_必赢备用网址 ,WHO 或者 SP_WHO2
sp_who [ [ **@loginame = ] 'login' | session ID | 'ACTIVE' **]
结果:
background:会话正在运行一个后台任务,例如死锁检测。
rollback: 会话具有正在处理的事务回滚。
pending: 会话正在等待工作线程变为可用。
runnable: 会话的任务在等待获取时间量程时位于计划程序的可运行队列中。
spinloop: 会话的任务正在等待调节锁变为可用。
suspended: 会话正在等待事件(如 I/O)完成。

background:会话正在运行一个后台任务,例如死锁检测。

方法三:根据SessionId查询

rollback: 会话具有正在处理的事务回滚。

CREATE PROCEDURE sp_who3 
(  @SessionID int = NULL ) 
AS
BEGIN
SELECT
    SPID                = er.session_id 
    ,Status             = ses.status 
    ,[Login]            = ses.login_name 
    ,Host               = ses.host_name 
    ,BlkBy              = er.blocking_session_id 
    ,DBName             = DB_Name(er.database_id) 
    ,CommandType        = er.command 
    ,SQLStatement       = st.text 
    ,ObjectName         = OBJECT_NAME(st.objectid) 
    ,ElapsedMS          = er.total_elapsed_time 
    ,CPUTime            = er.cpu_time 
    ,IOReads            = er.logical_reads + er.reads 
    ,IOWrites           = er.writes 
    ,LastWaitType       = er.last_wait_type 
    ,StartTime          = er.start_time 
    ,Protocol           = con.net_transport 
    ,ConnectionWrites   = con.num_writes 
    ,ConnectionReads    = con.num_reads 
    ,ClientAddress      = con.client_net_address 
    ,Authentication     = con.auth_scheme 
FROM sys.dm_exec_requests er 
OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) st 
LEFT JOIN sys.dm_exec_sessions ses 
ON ses.session_id = er.session_id 
LEFT JOIN sys.dm_exec_connections con 
ON con.session_id = ses.session_id 
WHERE er.session_id > 50 
    AND @SessionID IS NULL OR er.session_id = @SessionID 
ORDER BY
    er.blocking_session_id DESC
    ,er.session_id 
END

pending: 会话正在等待工作线程变为可用。

如何查询 who_sp存储过程的结果?

runnable: 会话的任务在等待获取时间量程时位于计划程序的可运行队列中。

  • 通过临时表

spinloop: 会话的任务正在等待调节锁变为可用。

suspended: 会话正在等待事件(如 I/O)完成。

CREATE TABLE #sp_who2
(
SPID INT,
Status VARCHAR(255),
      Login  VARCHAR(255),HostName  VARCHAR(255),
      BlkBy  VARCHAR(255),DBName  VARCHAR(255),
      Command VARCHAR(255),CPUTime INT,
      DiskIO INT,LastBatch VARCHAR(255),
      ProgramName VARCHAR(255),SPID2 INT,
      REQUESTID INT);

INSERT INTO #sp_who2 EXEC sp_who2

SELECT      * 
FROM        #sp_who2
-- Add any filtering of the results here :
WHERE       DBName = 'escm2'
-- Add any sorting of the results here :
ORDER BY    DBName ASC

DROP TABLE #sp_who2

注意:如果你的代码处理数据比较大,SQL会创建子线程进行并行处理,子线程的标示为ecid。

  • 还是临时表

别外,如果希望查看SQL进程的详细信息,可以使用下面代码

SELECT * FROM sys.sysprocesses
declare @tempTable table (SPID INT,Status VARCHAR(255),
      Login  VARCHAR(255),HostName  VARCHAR(255),
      BlkBy  VARCHAR(255),DBName  VARCHAR(255),
      Command VARCHAR(255),CPUTime INT,
      DiskIO INT,LastBatch VARCHAR(255),
      ProgramName VARCHAR(255),SPID2 INT,
      REQUESTID INT);

INSERT INTO @tempTable 
EXEC sp_who2
select *
from @tempTable
where DBName = 'escm2'

查看被锁住的对象,可以使用下面代码

查询当前服务用户执行的SQL的语句

SELECT * FROM sys.syslockinfo
-- 查询SQL语句
select 
    SPID                = er.session_id 
    ,Status             = ses.status 
    ,[Login]            = ses.login_name 
    ,Host               = ses.host_name 
    ,BlkBy              = er.blocking_session_id 
    ,DBName             = DB_Name(er.database_id) 
    ,CommandType        = er.command 
    ,SQLStatement       = st.text 
    ,ObjectName         = OBJECT_NAME(st.objectid) 
    ,ElapsedMS          = er.total_elapsed_time 
    ,CPUTime            = er.cpu_time 
    ,IOReads            = er.logical_reads + er.reads 
    ,IOWrites           = er.writes 
    ,LastWaitType       = er.last_wait_type 
    ,StartTime          = er.start_time 
    ,Protocol           = con.net_transport 
    ,ConnectionWrites   = con.num_writes 
    ,ConnectionReads    = con.num_reads 
    ,ClientAddress      = con.client_net_address 
    ,Authentication     = con.auth_scheme 
FROM sys.dm_exec_requests er 
OUTER APPLY sys.dm_exec_sql_text(er.sql_handle) st 
LEFT JOIN sys.dm_exec_sessions ses 
ON ses.session_id = er.session_id 
LEFT JOIN sys.dm_exec_connections con 
ON con.session_id = ses.session_id 
WHERE er.session_id > 50 
ORDER BY
    er.blocking_session_id DESC