一、核心概念:"Lock Waits/sec"
Lock Waits/sec表示 每秒内,因等待锁释放而阻塞的请求数量。数值越高,说明 SQL Server 中"锁争用"越严重,并发性能可能受影响。
二、各锁粒度的含义(14个子类别)
SQLServer:Locks下的每个子类别,对应 SQL Server 不同锁的粒度(即锁定的最小资源单位)。不同粒度决定了锁的"精细度"和"争用范围",以下是关键子类别解读:
1. RowGroup(行组锁)
-
场景:SQL Server 2016+ 引入的"行存储索引"优化特性(用于大容量插入/更新时的锁管理)。
-
意义 :对"行组(多个连续行组成的逻辑单元)"加锁时的等待次数。若此值高,可能是大表批量操作(如
BULK INSERT、分区切换)引发的锁争用。
2. OIB(Ordered Index Build,有序索引构建)
-
场景:索引创建/重建时,使用"有序索引构建"技术的锁等待。
-
意义 :反映索引维护操作(如
CREATE INDEX、ALTER INDEX REBUILD)的锁争用。若值高,可能是高峰期频繁重建索引导致资源竞争。
3. AllocUnit(分配单元锁)
-
场景:锁定"分配单元"(Allocation Unit,SQL Server 存储数据的最小逻辑单元,如行内数据、LOB 数据、行溢出数据等)。
-
意义:涉及数据页分配/回收(如堆表插入、索引分裂)时的锁等待。若值高,可能是频繁的页拆分、大对象(LOB)操作引发。
4. HoBT(Heap or B-Tree,堆或 B 树)
-
场景:锁定"堆(Heap,无聚集索引的表)"或"B 树(B-Tree,聚集索引/非聚集索引的物理结构)"。
-
意义:扫描、修改堆或索引层级结构时的锁争用。若值高,可能是全表扫描(堆表)、索引遍历(B 树)频繁冲突。
5. Metadata(元数据锁)
-
场景:锁定"元数据"(数据库对象定义,如表、视图、存储过程、列等)。
-
意义 :DDL 操作(
CREATE/ALTER/DROP TABLE)、权限变更或跨会话元数据查询时的锁等待。若值高,可能是频繁修改表结构、多会话并行查元数据导致。
6. Application(应用程序锁)
-
场景 :通过
sp_getapplock等存储过程,由应用程序自定义的业务逻辑锁(非 SQL Server 原生锁)。 -
意义:反映应用层业务锁的争用(如"订单号唯一性校验""流程互斥"等业务逻辑锁)。若值高,需检查应用锁的设计是否合理(如超时、重试逻辑)。
7. RID(行标识符锁)
-
场景:锁定"堆表中的单行"(RID 是堆表中行的唯一物理标识,类似聚集索引的"键")。
-
意义 :堆表上的单行操作(如
UPDATE/DELETE堆表行、SELECT ... FOR UPDATE)的锁等待。若值高,说明堆表行级并发冲突严重(堆表无聚集索引,锁粒度默认到 RID)。
8. Extent(区锁)
-
场景:锁定"区"(Extent,SQL Server 中 8 个连续数据页的集合)。
-
意义:批量操作(如大容量插入、区分配/回收)时的锁等待。若值高,可能是频繁的大容量数据加载、区级别的空间管理冲突。
9. Key(键锁)
-
场景:锁定"索引中的键值"(行级锁,最细粒度锁)。聚集索引/非聚集索引的键列被锁定时触发。
-
意义 :索引行的并发修改(如
UPDATE索引键、INSERT导致索引分裂)的锁等待。若值高,说明索引设计可能存在热点(如高频更新的键列)。
10. Page(页锁)
-
场景:锁定"数据页/索引页"(8KB 存储单元,包含多行)。
-
意义:页级操作的锁等待(如页拆分、页级扫描)。若值高,说明锁粒度较粗(相比键锁),或页内行冲突频繁(如热点页)。
11. Object(对象锁)
-
场景:锁定"数据库对象"(表、视图、存储过程等,比页/键更粗的粒度)。
-
意义 :表级锁(如
TABLOCK提示、批量插入默认表锁)或存储过程级锁的争用。若值高,可能是粗粒度锁提示滥用、批量操作频繁锁表。
12. File(文件锁)
-
场景:锁定"数据库文件"(如文件增长、收缩、备份时的元数据操作)。
-
意义:文件级别的资源竞争(如多文件组写入、自动增长过于频繁)。若值高,需检查文件配置(如是否合理分文件组、自动增长步长)。
13. Database(数据库锁)
-
场景:锁定"整个数据库"(如连接、分离、恢复、备份等全局操作)。
-
意义:数据库级别的全局锁争用(极低频,但关键)。若值高,可能是异常的数据库状态操作(如频繁分离/附加、备份冲突)。
14. _Total(总计)
- 含义 :上述所有锁粒度的
Lock Waits/sec之和,反映全局锁争用的总强度。
三、如何利用这些指标分析性能?
-
定位锁争用热点:
-
若某类锁(如
Key、Page、HoBT)的Lock Waits/sec持续高位,说明对应资源(索引、页、B 树)是并发瓶颈。 -
例如:
Key=24356(参考你提供的截图)远高于其他锁,说明索引键级的锁争用最严重,需重点分析索引设计、查询过滤条件是否导致热点。
-
-
关联业务场景:
- 结合业务高峰期(如订单峰值、报表跑批)的时间点,看哪些锁等待激增,反向推导业务操作的资源冲突点。
-
优化方向:
-
若
RID/Page高 → 考虑给堆表加聚集索引,缩小锁粒度到键级。 -
若
Object高 → 检查是否有不必要的表锁提示,或批量操作可拆分为小批次。 -
若
Metadata高 → 优化 DDL 操作时机(如低峰期执行表结构变更)。
-
简言之,这些指标是 SQL Server 并发性能的"透视镜"------通过观察不同锁粒度的等待次数,能精准定位哪里在抢资源、为什么抢,从而针对性优化~