有时候系统运行老感觉效率不高,并且有时候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 中此信息不完整。
显示的结果无法知道是哪个对象,可以使用下面的语句来查看
Select * From sysdatabases where dbid=[dbid] --数据库
Select * from sysobjects where id=[ObjId] --表或其他对象
Select * from sysindexes where id=[IndId] --索引
--此处[]内为表中对应列的值