SQL 系統進程的運行(status)狀態(Runnable、Running、Suspended、Sleeping、Pending、Dormant、Background、Spinlock)


SQL 系統進程的運行(status)狀態(Runnable、Running、Suspended、Sleeping、Pending、Dormant、Background、Spinlock)

1、狀態(status)解釋

  • “pending”(等待),代表這個process,既沒有Thread可用,也沒有CPU可用,正在同時等待這兩項系統資源。
  • “runnable”,代表這個process,有Thread可用,但沒有CPU可用,所以它正在等待CPU這項系統資源。
  • “running”,代表這個process,有Thread可用,有CPU可用。
  • “suspended”(暫停),代表這個process,正在「等待」別的process執行,等待的系統資源可能是Disk I/O或數據庫的Lock。(若這個process執行的SELECT沒加上NOLOCK關鍵字,而別的process正在進行「交易」或寫入(會加Lock),則這個SELECT的process就會呈現“suspended”的狀態。)
  • “sleeping”,代表這個process,目前沒在做任何事,正在等待進一步的指令。(sleeping 代表建立了數據庫連接,但程序沒有發出SQL命令. 因為應用程序為了減少打開和關閉連接的開銷,在完成數據庫中的操作后,仍然保持數據庫的連接,這些連接的最主要目的是重用。
  • “dormant”(暫時擱置),代表SQL Server正在對這個process做reset。
  • “background”,代表這個process正在SQL Server背景執行。即使你看到有很多“background”process正在執行,也不必擔心。
  • “Spinlock”(自旋鎖),本質上意味着查詢處於某種運行模式,它在CPU中忙於等待自己的輪詢。

2、查看的幾種方式:

//1
SELECT * FROM sys.sysprocesses;
//2
EXEC sp_who2;
//3
SELECT sqltext.TEXT, req.session_id, req.status, req.command, req.cpu_time, req.blocking_session_id, req.total_elapsed_time 
FROM sys.dm_exec_requests req (NOLOCK)
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS sqltext

3、sys.sysprocesses 主要字段解釋

  • Spid:Sql Servr 會話ID 
  • Kpid:Windows 線程ID 
  • Blocked:正在阻塞求情的會話 ID。如果此列為 Null,則標識請求未被阻塞 
  • Waittype:當前連接的等待資源編號,標示是否等待資源,0 或 Null表示不需要等待任何資源 
  • Waittime:當前等待時間,單位為毫秒,0 表示沒有等待 
  • DBID:當前正由進程使用的數據庫ID 
  • UID:執行命令的用戶ID 
  • Login_time:客戶端進程登錄到服務器的時間。 
  • Last_batch:上次執行存儲過程或Execute語句的時間。對於系統進程,將存儲Sql Server 的啟動時間 
  • Open_tran:進程的打開事務個數。如果有嵌套事務,就會大於1 
  • Status:進程ID 狀態,dormant = 正在重置回話 ; running = 回話正在運行一個或多個批處理 ; background = 回話正在運行一個后台任務 ; rollback = 會話正在處理事務回滾 ; pending = 回話正在等待工作現成變為可用 ; runnable = 會話中的任務在等待獲取 Scheduler 來運行的可執行隊列中 ; spinloop = 會話中的任務正在等待自旋鎖變為可用 ; suspended = 會話正在等待事件完成 
  • Hostname:建立鏈接的客戶端工作站的名稱 
  • Program_name:應用程序的名稱,就是 連接字符串中配的 Application Name 
  • Hostprocess:建立連接的應用程序在客戶端工作站里的進程ID號 
  • Cmd:當前正在執行的命令 
  • Loginame:登錄名  

4、檢查死鎖進程的方式

//方式1
declare @spid int,@bl int  
DECLARE s_cur CURSOR FOR   select  0 ,blocked   from (select * from sys.sysprocesses where  blocked>0 ) a  
where not exists(select * from (select * from sys.sysprocesses where  blocked>0 ) b   where a.blocked=spid)   
union 
select spid,blocked from sys.sysprocesses where  blocked>0   OPEN s_cur   FETCH NEXT FROM s_cur INTO @spid,@bl   WHILE @@FETCH_STATUS = 0  
begin   if @spid =0             
select ' 引起數據庫死鎖的是: '+ CAST(@bl AS VARCHAR(10)) + ' 進程號, 其執行的SQL 語法如下'   else              
select ' 進程號SPID :'+ CAST(@spid AS VARCHAR(10))+ ' 被' + ' 進程號SPID :'+ CAST(@bl AS VARCHAR(10)) +' 阻塞, 其當前進程執行的SQL 語法如下' 
DBCC INPUTBUFFER (@bl )   FETCH NEXT FROM s_cur INTO @spid,@bl   end   CLOSE s_cur  
DEALLOCATE s_cur

//方式2
use master
go
--檢索死鎖進程
select spid, blocked, loginame, last_batch, status, cmd, hostname, program_name
from sysprocesses
where spid in
( select blocked from sysprocesses where blocked <> 0 ) or (blocked <>0)

參考死鎖的解決方式:鏈接  

  

 

 

創建時間:2022.02.15  更新時間:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM