暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL Server tempdb 闩锁争用

SQLServer 2022-03-07
943


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

Wait type                Wait resource

PAGELATCH_UP       2:15:121320

PAGELATCH_UP       2:15:121320

 

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

 

如何识别页面是 PFSGAMIAM

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


文章转载自SQLServer,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论