现象 1


分析 2
会话等待的资源“2 : 1:xxxxxxx ” 代表 ID为 2 的数据库( tempdb)的 1号文件(tempdev)的 xxxx xxx页。SQL语句创建一个临时表时,相当于在tempdb中创建一张表 , SQL Server要为这张表分配存储页面,需要修改 SGAM、PFS、 GAM系统数据页,为了 其他表不会分配到同一个数据页,在修改时使用闩锁,修改完成后释放闩锁。
这种机制对一般的用户数据库不会有问题,因为正常的应用不会折腾着不停地建表、删表。 但是 tempdb 就不同了,经常会有高并发的SQL语句使用临时表 。因此 在同一个时间点会有很多线程要修改系统页,就会产生大量的 PAGELATCH_U P闩锁等待。
解决 3
-
文件个数一定要和CPU核数对齐,也就是能被CPU核数整除。例如是40个核,则可以创建4个、8个、10个、20个等。建议最少4个, 最多 可 以和CP U 的核 数一 样多,但 一般 的服 务器CPU核数都在几十 个 ,没有必要创建这么多。
-
每个数据文件的初始大小和增长大小的配置一定要一致,如果不一致,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文件同步到备机。
