一. 概述 在生產資料庫運行期間,有時我們需要查看當前用戶會話狀態或者是說資料庫當前是否運行良好, 應用的場景比如:當運行的應用系統響應突然變慢時需要分析資料庫的、或想分析當前的資料庫是否繁忙,是否有長時間的等待, 又或者執行一個sql的回滾狀態查看,想手動kill掉一個會話時 等等。都需要從當前的 ...
一. 概述
在生產資料庫運行期間,有時我們需要查看當前用戶會話狀態或者是說資料庫當前是否運行良好, 應用的場景比如:當運行的應用系統響應突然變慢時需要分析資料庫的、或想分析當前的資料庫是否繁忙,是否有長時間的等待, 又或者執行一個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