SQL SERVER的LATCH

本文详细探讨了SQLSERVER中的LATCH和spinlock在内存管理和并发控制中的作用,比较了与Oracle的不同,特别强调了SuperLatch在高并发环境中的优化。作者指出通过理解这些原理有助于诊断和解决问题,提出了基于知识图谱的SQLSERVER性能分析方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天聊了下SQLSERVER的spinlock,当时我认为spinlock是与Oracle LATCH相对应的结构,事实上碎片化的阅读会带来一些知识掌握的不准确。Oracle的LATCH是通过spin来实现锁的获取的,spin是LATCH获取轻量级锁的一种方式。而在SQLSERVER中,LATCH和spinlock被设计成两种轻量级锁,分别用于不同的场景。Oracle有shared pool,library cache等结构,可以用shared pool闩锁来保护整个共享池,共享池中新增的一些乱七八糟的数据结构可以通过shared pool闩锁以及mutex来实现串行化访问保护。

SQLSERVER中并无此类机制,因此对于一些重度访问的内存结构,设计了LATCH来保护,而其他的一些数据结构,使用spinlock。在SQLSERVER中,总是使用spinlock来保护那些访问十分快速的内存结构。

LATCH是 SQL Server 的SQL引擎用来保证内存结构的一致性的轻量级原子操作用来保护索引、数据页和内部结构等结构,例如 B 树中的非叶页。LATCH仅存在于SQL引擎内部。SQL Server 使用缓冲LATCH来保护缓冲池中的页面,并使用 I/O LATCH来保护尚未加载到缓冲池中的页面。每当向 SQL Server 缓冲池中的页面写入或读取数据时,工作线程必须首先获取该页面的缓冲LATCH。有多种缓冲LATCH类型可用于访问缓冲池中的页面,包括独占LATCH (PAGELATCH_EX) 和共享LATCH(PAGELATCH_SH)。

当 SQL Server访问一个尚未加载到缓冲池中的页面时,将通过一个异步 I/O操作将该页面加载到缓冲池中。如果 SQL Server 需要等待 I/O 子系统响应,它将根据请求类型等待独占 (PAGEIOLATCH_EX) 或共享 (PAGEIOLATCH_SH) I/O LATCH;这样做是为了防止另一个工作线程使用不兼容的LATCH将同一页面加载到缓冲池中。LATCH还用于保护对缓冲池页面以外的内部存储器结构的访问;这些被称为非缓冲LATCH。

PAGELATCH的争用在多 CPU 系统十分常见。当多个线程同时尝试获取相同内存结构的不兼容LATCH时,就会发生LATCH争用。闩锁是一种内部并发控制机制,SQL 引擎会自动确定何时使用它们。因为闩锁的行为是确定性的,数据库SCHEMA的设计,表、索引等的设计会影响闩锁争用。

非缓存页的闩锁名称为LATCH_XX,其中“_XX”后缀表示了闩锁的模式(PAGEIOLATCH/PAGELATCH也使用后缀表示模式)。SQL Server 的闩锁模式可以总结如下:

  1. KP——保持LATCH,确保引用的结构不会被破坏。当线程想要查看缓冲区结构时使用。因为 KP LATCH兼容除销毁(DT)之外的所有LATCH,因此 KP 闩锁被认为是“轻量级”的,这意味着使用它时对性能的影响最小。由于 KP 闩锁与 DT 闩锁不兼容,它会阻止任何其他线程破坏引用的结构。KP 闩锁将防止它引用的结构被lazywriter 进程破坏(脏块写盘并释放缓冲);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值