在 SQL Server 中,当创建临时表、进行排序、哈希连接等操作时,需要在 tempdb 中快速分配空间,这个分配过程由几种特殊的系统页面进行管理:
PFS (Page Free Space): 跟踪每一页的使用情况。
GAM (Global Allocation Map): 跟踪哪些区(Extent)是可用的。
SGAM (Shared Global Allocation Map): 跟踪哪些区是混合使用的。
当只有一个 tempdb 数据文件时,所有会话的分配请求都会集中在这一个文件的 PFS/GAM/SGAM 页上,形成严重的 闩锁 (Latch) 争用,成为性能瓶颈。
添加多个 tempdb 数据文件后,SQL Server 对 tempdb 多个数据文件采用 輪詢(Round-Robin)分配算法,所有 8 个文件从一开始就会同时被写入,从而极大地缓解了争用,提升了并发处理能力。
下面是针对一台8核CPU的服务器,给 tempdb 配置 8 个数据文件的完整代码:
-- =====================================================
-- 步驟一:調整默認數據文件 tempdev
-- 當前 1421MB,調整為 1536MB,增長量從 512MB 改為 128MB
-- =====================================================
USE master
GO
ALTER DATABASE tempdb
MODIFY FILE
(
NAME = tempdev,
SIZE = 1536MB,
FILEGROWTH = 128MB
)
GO
-- =====================================================
-- 步驟二:添加 7 個額外數據文件到 F 盤
-- 每個文件 1536MB,增長量 128MB,與 tempdev 完全一致
-- =====================================================
-- 添加第 2 個數據文件
ALTER DATABASE tempdb
ADD FILE
(
NAME = tempdev2,
FILENAME = 'F:\SQLlog\tempdb2.ndf',
SIZE = 1536MB,
FILEGROWTH = 128MB
)
GO
-- 添加第 3 個數據文件
ALTER DATABASE tempdb
ADD FILE
(
NAME = tempdev3,
FILENAME = 'F:\SQLlog\tempdb3.ndf',
SIZE = 1536MB,
FILEGROWTH = 128MB
)
GO
-- 添加第 4 個數據文件
ALTER DATABASE tempdb
ADD FILE
(
NAME = tempdev4,
FILENAME = 'F:\SQLlog\tempdb4.ndf',
SIZE = 1536MB,
FILEGROWTH = 128MB
)
GO
-- 添加第 5 個數據文件
ALTER DATABASE tempdb
ADD FILE
(
NAME = tempdev5,
FILENAME = 'F:\SQLlog\tempdb5.ndf',
SIZE = 1536MB,
FILEGROWTH = 128MB
)
GO
-- 添加第 6 個數據文件
ALTER DATABASE tempdb
ADD FILE
(
NAME = tempdev6,
FILENAME = 'F:\SQLlog\tempdb6.ndf',
SIZE = 1536MB,
FILEGROWTH = 128MB
)
GO
-- 添加第 7 個數據文件
ALTER DATABASE tempdb
ADD FILE
(
NAME = tempdev7,
FILENAME = 'F:\SQLlog\tempdb7.ndf',
SIZE = 1536MB,
FILEGROWTH = 128MB
)
GO
-- 添加第 8 個數據文件
ALTER DATABASE tempdb
ADD FILE
(
NAME = tempdev8,
FILENAME = 'F:\SQLlog\tempdb8.ndf',
SIZE = 1536MB,
FILEGROWTH = 128MB
)
GO
-- =====================================================
-- 步驟三:調整日誌文件 templog
-- 當前 179MB 過小,調整為 512MB,增長量改為 128MB
-- =====================================================
ALTER DATABASE tempdb
MODIFY FILE
(
NAME = templog,
SIZE = 512MB,
FILEGROWTH = 128MB
)
GO
添加 ndf 文件时,硬盘会紧张,ERP等应用系统会有卡顿,第三步执行完后,要重启SQL SERVER,否则新加的 ndf 文件不会生效。
