tempdb大量闩锁等待问题分析

来源:这里教程网 时间:2026-03-02 12:36:00 作者:

现象 1

登录到SQL专家云中,进入实时可视化页面,在活动会话里面看到有大量资源等待的会话。

点击一个时间点,进入到该时间点的活动会话原始数据。看到大量会话的等待类型为 PAGELATCH_UP,等待资源为 “2:1:xxxxxxx” , SQL语句都和临时表有关。

分析 2

会话等待的资源“2 1:xxxxxxx ” 代表 ID 2 的数据库( tempdb)1号文件(tempdev)的 xxxx xxx页。SQL语句创建一个临时表时,相当于在tempdb中创建一张表 SQL Server要为这张表分配存储页面,需要修改 SGAM、PFS、 GAM系统数据页,为了 其他表不会分配到同一个数据页,在修改时使用闩锁,修改完成后释放闩锁。

这种机制对一般的用户数据库不会有问题,因为正常的应用不会折腾着不停地建表、删表。 但是 tempdb 就不同了,经常会有高并发的SQL语句使用临时表 。因此 在同一个时间点会有很多线程要修改系统页,就会产生大量的 PAGELATCH_U P闩锁等待。

解决 3

 最直接的解决办法是增加tempdb数据文件的个数,这样多个线程修改系统页时就被分配到不同的数据文件上,从而降低了闩锁争用。在增加数据文件时有2点重要的注意事项:
  1. 文件个数一定要和CPU核数对齐,也就是能被CPU核数整除。例如是40个核,则可以创建4个、8个、10个、20个等。建议最少4个, 最多 以和CP U 的核 数一 样多,但 一般 的服 务器CPU核数都在几十 ,没有必要创建这么多

  2. 每个数据文件的初始大小和增长大小的配置一定要一致,如果不一致,SQL Server将不会平均地使用每个数据文件,而是先使用容量最大的数据文件。

tempdb的重要性 4

 临时表、表变量、查询语句(ORDER BY、GROUP BY、UNION等)、触发器、索引维护、快照事务隔离级别等很多功能都会用到tempdb,详细参考微软官方文档 https://docs.microsoft.com/zh-cn/sql/relational-databases/databases/tempdb-database?view=sql-server-ver15。

最佳实践 5

对tempdb依赖 较高的实 例,可以 te mpdb 单独 一个快 速的 物理 盘,例如SSD ,让tempdb独享I/O资源, 用户数据 争抢,从而加快tempdb的响应速度 。如果服务器有基于磁盘镜像的容灾软件,为tempdb规划单独的磁盘的另一个好处是不用把temdp文件同步到备机。

北京格瑞趋势科技有限公司是聚焦于数据服务的高新技术企业,成立于2008年,创始团队及核心技术人员来自微软和雅虎。微软数据平台金牌合作伙伴,卫宁健康数据平台战略合作伙伴。通过产品+服务双轮驱动的业务模式,14年间累计服务4000+客户,覆盖互联网、市政、交通、电信、医疗、教育、电力、制造业等各个领域。

相关推荐