SQL 系統(tǒng)進程的運行(status)狀態(tài)(Runnable、Running、Suspended、Sleeping、Pending、Dormant、Background、Spinlock)
發(fā)布時間:2025/7/15 12:13:30 作者:Admin 閱讀:27
廣告:
1、狀態(tài)(status)解釋
- “pending”(等待),代表這個process,既沒有Thread可用,也沒有CPU可用,正在同時等待這兩項系統(tǒng)資源。
- “runnable”,代表這個process,有Thread可用,但沒有CPU可用,所以它正在等待CPU這項系統(tǒng)資源。
- “running”,代表這個process,有Thread可用,有CPU可用。
- “suspended”(暫停),代表這個process,正在「等待」別的process執(zhí)行,等待的系統(tǒng)資源可能是Disk I/O或數(shù)據(jù)庫的Lock。(若這個process執(zhí)行的SELECT沒加上NOLOCK關(guān)鍵字,而別的process正在進行「交易」或?qū)懭耄〞覮ock),則這個SELECT的process就會呈現(xiàn)“suspended”的狀態(tài)。)
- “sleeping”,代表這個process,目前沒在做任何事,正在等待進一步的指令。(sleeping 代表建立了數(shù)據(jù)庫連接,但程序沒有發(fā)出SQL命令. 因為應用程序為了減少打開和關(guān)閉連接的開銷,在完成數(shù)據(jù)庫中的操作后,仍然保持數(shù)據(jù)庫的連接,這些連接的最主要目的是重用。)
- “dormant”(暫時擱置),代表SQL Server正在對這個process做reset。
- “background”,代表這個process正在SQL Server背景執(zhí)行。即使你看到有很多“background”process正在執(zhí)行,也不必擔心。
- “Spinlock”(自旋鎖),本質(zhì)上意味著查詢處于某種運行模式,它在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:當前正由進程使用的數(shù)據(jù)庫ID
- UID:執(zhí)行命令的用戶ID
- Login_time:客戶端進程登錄到服務器的時間。
- Last_batch:上次執(zhí)行存儲過程或Execute語句的時間。對于系統(tǒng)進程,將存儲Sql Server 的啟動時間
- Open_tran:進程的打開事務個數(shù)。如果有嵌套事務,就會大于1
- Status:進程ID 狀態(tài),dormant = 正在重置回話 ; running = 回話正在運行一個或多個批處理 ; background = 回話正在運行一個后臺任務 ; rollback = 會話正在處理事務回滾 ; pending = 回話正在等待工作現(xiàn)成變?yōu)榭捎?; runnable = 會話中的任務在等待獲取 Scheduler 來運行的可執(zhí)行隊列中 ; spinloop = 會話中的任務正在等待自旋鎖變?yōu)榭捎?; suspended = 會話正在等待事件完成
- Hostname:建立鏈接的客戶端工作站的名稱
- Program_name:應用程序的名稱,就是 連接字符串中配的 Application Name
- Hostprocess:建立連接的應用程序在客戶端工作站里的進程ID號
- Cmd:當前正在執(zhí)行的命令
- Loginame:登錄名
檢查死鎖進程的方式
//方式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 ' 引起數(shù)據(jù)庫死鎖的是: '+ CAST(@bl AS VARCHAR(10)) + ' 進程號, 其執(zhí)行的SQL 語法如下' else
select ' 進程號SPID :'+ CAST(@spid AS VARCHAR(10))+ ' 被' + ' 進程號SPID :'+ CAST(@bl AS VARCHAR(10)) +' 阻塞, 其當前進程執(zhí)行的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)
廣告:
相關(guān)文章


