tempdb 是什么?为什么常成性能瓶颈
解释 tempdb 的用途(排序、哈希、工作表、行版本等)、为什么多库共享它容易成瓶颈,以及缓解瓶颈的常用手法。
结论先行
tempdb 是每个引擎自带的公共工作库:所有库的排序、哈希连接、临时表、表变量、行版本存储都落在这里,所以任何库的写压力都会汇聚到它头上。它成瓶颈的典型信号是 SGAM/PGAM 页 latch 等待聚集——本质是「多个会话抢少数几个文件的前端分配页」。缓解办法:多文件摊薄分配竞争 + 放高速存储 + 启动时预分配到位。
tempdb 在替谁干活
| 用途 | 说明 |
|---|---|
| 显式临时表(#t)/ 表变量(@t) | 默认落 tempdb |
| 排序、哈希操作 | ORDER BY/GROUP BY/JOIN 的空间不足缓冲时溢出到磁盘 |
| 行版本(快照隔离、延迟提交) | 快照隔离的事务版本存 tempdb |
| 工作表、中间结果 | 大查询的执行中间物化 |
为什么会成瓶颈
- 每个 tempdb 文件只有一个 SGAM 页管理未分配空间;单文件扛多核并发分配时,所有会话排在同一个 latch 后面。
- 文件不够大时频繁自动增长,每次增长都是一次 I/O 停顿。
- 放错慢盘(和数据文件同卷且卷打满)放大延迟。
缓解手法
-- 查看当前 tempdb 文件
SELECT name, size/128.0 AS mb FROM sys.master_files WHERE database_id = DB_ID(N'tempdb');
-- 加文件:数量经验值参考该卷 CPU 核心数(常见每核心 1 个或减半),放独立高速卷
ALTER DATABASE tempdb ADD FILE (NAME = N'tempdev2', FILENAME = N'F:\tempdb\tempdev2.ndf', SIZE = 8GB);
- 启动前预分配到位:文件建大一点,省掉运行中自动增长。
- 大库的快照隔离、频繁的大排序查询先优化 SQL,别让 tempdb 替烂查询擦屁股。
- 重启后临时对象不保留,tempdb 每次重启自动重建到初始大小。
在 SQL Server 2022 Developer、SQL Server 2025 Developer 条目环境上均可按上述步骤实验;tempdb 文件路径查看可在 SSMS 管理工具条目 的对象资源管理器中右键实例 → 数据库 → tempdb → 文件确认。