为 tempdb 配 8 个数据文件

在 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 文件不会生效。

发表评论