有時候系統運行老感受效率不高,而且有時候sql還有超時的報錯,可是併發量並不高。經過排查定位sql是否有執行效率問題sql
-- 開事務, 以保持鎖 BEGIN TRAN -- 更新 update table a set column1 = 1 where idx = 1 -- 列出鎖信息 EXEC sp_lock @@spid -- 提交或者回滾事務 COMMIT/ROLLBACK TRAN
經過執行sp_lock存儲過程,查看鎖信息(相似以下)數據庫
spid | dbid | ObjId | IndId | Type | Resource | Mode | Status |
52 | 8 | 0 | 0 | DB | S | GRANT | |
52 | 1 | 1.12E+09 | 0 | TAB | IS | GRANT | |
52 | 8 | 9.18E+08 | 1 | PAG | 1:425705 | IX | GRANT |
52 | 8 | 9.18E+08 | 0 | TAB | IX | GRANT | |
52 | 8 | 9.18E+08 | 1 | KEY | -1E+10 | X | GRANT |
經過 dbid, ObjId 能夠找到你更新的表相關的鎖記錄
若是 IndId 爲 0 , 表示鎖在表上, 不然在對應的索引上
經過 Type 列, 能夠肯定被鎖定的是行/表, 或者是其餘, 而且能夠經過 Mode 看到是什麼鎖
在Status 中, 還能夠看到鎖是已經加上了, 仍是在等待其餘資源釋放(以取得加鎖的權利)
spid dbid ObjId IndId Type Resource Mode Status
------ ------ ----------- ------ ---- -------------------------- -------- ------
53 1 1115151018 0 TAB IS GRANT併發
鎖的類型(Tyep 列值, RID 和 KEY 的話, 表示鎖在行上) 有以下幾種:
RID = 表中單個行的鎖,由行標識符 (RID) 標識。
KEY = 索引內保護可串行事務中一系列鍵的鎖。
PAG = 數據頁或索引頁的鎖。
EXT = 對某區的鎖。
TAB = 整個表(包括全部數據和索引)的鎖。
DB = 數據庫的鎖。
FIL = 數據庫文件的鎖。
APP = 指定的應用程序資源的鎖。
MD = 元數據或目錄信息的鎖。
HBT = 堆或 B 樹索引的鎖。在 SQL Server 2005 中此信息不完整。
AU = 分配單元的鎖。在 SQL Server 2005 中此信息不完整。spa
顯示的結果沒法知道是哪一個對象,能夠使用下面的語句來查看
Select * From sysdatabases where dbid=[dbid] --數據庫
Select * from sysobjects where id=[ObjId] --表或其餘對象
Select * from sysindexes where id=[IndId] --索引
--此處[]內爲表中對應列的值code