SQL Server tempdb 闩锁争用

当在TempDb中遇到PAGELATCH_*类型的页面争用时,可能是由于PFS、GAM或SGAM页面。识别这些页面类型可通过计算页面号与特定间隔的关系。解决争用的方法包括增加TEMPDB数据文件数量,启用跟踪标志1118,以及优化代码。最佳实践是创建多个大小相等的tempdb数据文件。

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

当你反复创建和删除 TempDb 对象(临时表、表变量等)时,你可能会在 tempdb 中看到页面的闩锁争用。当你注意到tempdb 上的 PAGELATCH_* 争用(sysprocesses 中的等待资源以 2: 开头)时,请检查闩锁等待是否在 PFS、GAM 或 SGAM 页面上。当 tempdb 上存在闩锁争用时,你将看到许多会话在PAGELATCH_* 上等待,类似如下等等。

Wait type                Wait resource

PAGELATCH_UP       2:15:121320

PAGELATCH_UP       2:15:121320

上面的会话正在等待资源2:15:121320,数据库id为2,即tempdb,文件号为15,页码为121320。121320 是 8088 的倍数,所以它是一个 PFS 页面,如果不是 PFS 页面,我们也可以识别正在等待的页面是 GAM 还是 SGAM 页面。

如何识别页面是 PFS、GAM、IAM

PFS 页面:一个 PFS 页面在 8088 个页面中出现一次。SQL Server 将尝试在每个 PFS 间隔 (8088页) 的第一页上放置一个 PFS 页。文件头部页在第一个,PFS 页在其后。(页面 ID 从 0 开始,因此第一个 PFS 页面位于页面 ID 1)。如果(page number)/8088 是整数值,则该页为 PFS 页面。

GAM 页面: GAM页面是数据文件中的第 2 页,下一个 GAM 页面放置在第一个 GAM 页面之后的 511230 页(GAM 间隔)。如果 (page number-1)/511230 是整数值,那么页面就是 GAM 页面。

SGAM页面: SGAM 页面是数据文件中的第 3 页,下一个 SGAM 页面放置在第一个 SGAM 页面之后的 511230 Page 处。如果 (pagenumber-2)/511230 是整数,则该页面是 GAM 页面。

何解决闩锁争用?

  • 增加 TEMPDB 数据文件文件的数量,大小均等。这也有通用规则,如果逻辑处理器的数量小于或等于 8,则应使用与逻辑处理器相同数量的数据文件。如果逻辑处理器的数量大于 8,则使用 8 个数据文件。如果争用仍然存在,则将数据文件的数量进一步增加 4 的倍数,不过一旦达到 32 个文件,就可能没什么效果了。 

  • 启用服务器端跟踪标志 1118。跟踪标志 1118 用于启用对象的专用扩展区分配,而不是从混合扩展区分配页面。

  • 如果你在执行上述两个步骤后在 PFS 页面上还能看到闩锁争用,那么唯一的选择是修改你的代码以限制 tempdb 的使用。

  • 如果你在 2:1:103 看到争用(第 103 页用于系统表 sys.sysmultiobjrefs。该表管理每个数据库中创建的对象之间的关系)。减少此页面上的争用的唯一方法是减少关系。使用主键创建大量临时表的示例可能会导致这种争用,因为表和主键约束之间的关系必须在 sys.sysmultiobjrefs 中更新。

最佳实践是什么?

  1. 创建多个 tempdb 数据文件,而不是创建 1 个大文件,并在所有 SQL Server 实例中均等地调整它们的大小。

  2. 默认设置TF1118。

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值