一. 概述
在生產數據庫運行期間,有時我們需要查看當前用戶會話狀態或者是說數據庫當前是否運行良好, 應用的場景比如:當運行的應用系統響應突然變慢時需要分析數據庫的、或想分析當前的數據庫是否繁忙,是否有長時間的等待, 又或者執行一個sql的回滾狀態查看,想手動kill掉一個會話時 等等。都需要從當前的會話狀態去分析。
這篇主要介紹sys.sysprocesses 函數,這里面包含了當前用戶大量的信息,如會話進程有多少,等待時間,open_tran有多少事務,阻塞會話是多少等 整體內容更為詳細是一個分析當前會話狀態比較好的切入點。
SELECT * FROM sys.sysprocesses
下面先來介紹來函數的字段說明,字段很多一個個來詳細介紹下,了解了含義后,后面來案例分析:
字段名稱 |
說明 |
spid 會話ID(進程ID) |
SQL內部對一個連接的編號,一般來講,小於50,如果用戶連接的編號,大於50 |
blocked 阻塞ID |
阻塞的進程ID, 值大於0表示阻塞, 值為本身進程ID表示io操作 如果blocked>0,但waittime時間很短,說明阻塞時間不長,不嚴重
|
waitresource 等待資源 |
格式為 fileid:pagenumber:rid 如(5:1:8235440) |
kipid 線程ID |
當kpid值為不0時,代表當前是活動用戶 kpid=0, waittime=0 空閑連接 kpid>0, waittime=0 運行狀態 kpid>0, waittime>0 需要等待某個資源,才能繼續執行,一般會是suspended(等待io) kpid=0, waittime=0 但它還是阻塞的源頭,查看open_tran>0 事務沒有及時提交
|
waittime |
當前等待時間(以毫秒為單位) |
open_tran |
進程的打開事務數 |
hostname |
建立連接的客戶端工作站的名稱 |
program_name |
應用程序的名稱 |
hostprocess |
工作站進程 ID 號 |
loginame |
登錄名 |
status |
running = 會話正在運行一個或多個批 如果status 上有好幾個runnable狀態任務,需要認真對待。 cpu負荷過重沒有及時處理用戶的並發請求 |
其它字段信息查看msdn
1.1 查看用戶會話信息
select * from sys.sysprocesses where spid>50
1.2 查看活動用戶信息
SELECT spid,kpid,blocked ,waittime AS 'waitms', lastwaittype, DB_NAME(dbid), waitresource, open_tran,hostname,[program_name],hostprocess,loginame, [status] FROM sys.sysprocesses WITH(NOLOCK) WHERE kpid>0 AND [status]<>'sleeping' AND spid>50 ORDER BY waittime DESC
1.3 查看用戶阻塞會話信息
SELECT spid,kpid,blocked ,waittime AS 'waitms', lastwaittype, DB_NAME(dbid), waitresource, open_tran,hostname,[program_name],hostprocess,loginame, [status] FROM sys.sysprocesses WITH(NOLOCK) WHERE blocked>0 AND spid>50 ORDER BY waittime DESC
1.4 查看系統會話信息
select * from sys.sysprocesses where spid<=50