sql – 如何找出为什么spid的状态被暂停? spid正在等待什么资源?

前端之家收集整理的这篇文章主要介绍了sql – 如何找出为什么spid的状态被暂停? spid正在等待什么资源?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我运行EXEC sp_who2 78我得到以下结果:

我如何找到为什么它的状态被暂停?

这个过程是一个基于昂贵查询的沉重的INSERT.一个大的SELECT可以从多个表中获取数据,并将大约3-4百万行写入不同的表.

没有锁/块.

链接到的等待类型是CXPACKET.我可以理解,因为有9 78s,你可以看到下面的图片.

关于我和我真正想知道的是为什么SPID 78的第1号被暂停.

我知道当SPID的状态被暂停时,这意味着进程正在等待资源,并且在获取资源时它将恢复.

我如何找到更多的细节?什么资源?为什么不可用?

我使用了很多下面的代码和变体,但还有什么我可以做的,以确定为什么SPID被暂停?

select * 
from sys.dm_exec_requests r
join sys.dm_os_tasks t on r.session_id = t.session_id
where r.session_id = 78

我已经使用了sp_whoisactive.我得到的这个特定的spid78的结果如下:(分为3图片以适合屏幕)

解决方法

暂停:
这意味着请求当前没有活动,因为它正在等待资源.资源可以是用于读取页面的I / O,WAITIT可以在网络上进行通信,或者正在等待锁定或锁存.一旦等待的任务完成,它将变得活跃.例如,如果查询已经发布了I / O请求来读取完整表的数据tbl学生,那么这个任务将被暂停,直到I / O完成.一旦I / O完成(内存中可用的表tbl学生的数据),查询将移动到RUNNABLE队列中.

所以如果它在等待,请检查wait_type列,了解它正在等待什么,并根据wait_time进行故障排除.

我已经开发了以下程序来帮助我,包括WAIT_TYPE.

use master
go

CREATE PROCEDURE [dbo].[sp_radhe] 

AS
BEGIN

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT es.session_id AS session_id,COALESCE(es.original_login_name,'') AS login_name,COALESCE(es.host_name,'') AS hostname,COALESCE(es.last_request_end_time,es.last_request_start_time) AS last_batch,es.status,COALESCE(er.blocking_session_id,0) AS blocked_by,COALESCE(er.wait_type,'MISCELLANEOUS') AS waittype,COALESCE(er.wait_time,0) AS waittime,COALESCE(er.last_wait_type,'MISCELLANEOUS') AS lastwaittype,COALESCE(er.wait_resource,'') AS waitresource,coalesce(db_name(er.database_id),'No Info') as dbid,COALESCE(er.command,'AWAITING COMMAND') AS cmd,sql_text=st.text,transaction_isolation =
    CASE es.transaction_isolation_level
    WHEN 0 THEN 'Unspecified'
    WHEN 1 THEN 'Read Uncommitted'
    WHEN 2 THEN 'Read Committed'
    WHEN 3 THEN 'Repeatable'
    WHEN 4 THEN 'Serializable'
    WHEN 5 THEN 'Snapshot'
END,COALESCE(es.cpu_time,0) 
    + COALESCE(er.cpu_time,0) AS cpu,COALESCE(es.reads,0) 
    + COALESCE(es.writes,0) 
    + COALESCE(er.reads,0) 
    + COALESCE(er.writes,0) AS physical_io,COALESCE(er.open_transaction_count,-1) AS open_tran,COALESCE(es.program_name,'') AS program_name,es.login_time
FROM sys.dm_exec_sessions es
    LEFT OUTER JOIN sys.dm_exec_connections ec ON es.session_id = ec.session_id
    LEFT OUTER JOIN sys.dm_exec_requests er ON es.session_id = er.session_id
    LEFT OUTER JOIN sys.server_principals sp ON es.security_id = sp.sid
    LEFT OUTER JOIN sys.dm_os_tasks ota ON es.session_id = ota.session_id
    LEFT OUTER JOIN sys.dm_os_threads oth ON ota.worker_address = oth.worker_address
    CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) AS st
where es.is_user_process = 1 
  and es.session_id <> @@spid
ORDER BY es.session_id

end

下面的查询也可以显示spid暂停时的基本信息,以显示spid正在等待哪个资源.

SELECT  wt.session_id,ot.task_state,wt.wait_type,wt.wait_duration_ms,wt.blocking_session_id,wt.resource_description,es.[host_name],es.[program_name] 
FROM  sys.dm_os_waiting_tasks  wt  
INNER  JOIN sys.dm_os_tasks ot ON ot.task_address = wt.waiting_task_address 
INNER JOIN sys.dm_exec_sessions es ON es.session_id = wt.session_id 
WHERE es.is_user_process =  1

以下图为例:

猜你在找的MsSQL相关文章