跳转至

TempDB数据库配置#

TempDB对于性能至关重要,因为它会被多个用户和系统操作(如游标、临时表、用于排序的哈希表、重新编制索引等)使用。建议您在分隔OLTP数据文件和日志文件之前处理TempDB。

TempDB通常是生产SQL Server实例中最活跃的数据库之一,因此强烈建议对TempDB使用单独的LUN。TempDB数据文件和日志文件应放置在不同的物理驱动器上,但生产数据库数据文件和日志文件除外。由于TempDB的活跃度很高,因此最好确保使用SSD对这些驱动器进行保护或使用RAID 10进行条带化。

Microsoft SQL Server客户咨询团队(SQLCAT)建议TempDB为每个CPU核心提供一个数据文件。然而,此建议最适合于非常繁重的工作负载。一般而言,更常见的建议是,TempDB的数据文件与CPU核心的比率为1:2或1:4。与大多数性能建议一样,这只是一个通用的指导原则。您的系统要求可能会有所不同。如果您不确定要将多少个数据文件用于TempDB,则通常建议从4个数据文件开始。通常,一个日志文件就足以支持TempDB。(有关更深入的TempDB建议,请参阅将SQL Server数据库分解为多个文件一节中列出的资源。)

默认情况下,TempDB文件与SQL Server二进制文件放在同一个驱动器上。即使用户选择了自定义安装,TempDB仍然会与其他数据文件放在同一个驱动器中。然而,TempDB数据文件应该存储在它们自己的专用驱动器上。这个问题必须通过首先将TempDB移动到它自己的单独驱动器来予以纠正。在下面的示例中,我们将数据文件放在T:驱动器上,将日志文件放在L:驱动器上。请注意,在运行该命令之前,目录路径必须已经存在。

USE [master]
GO
ALTER DATABASE [tempdb] MODIFY FILE (NAME='tempdev', FILENAME='T:\MSSQL\DATA\tempDB.mdf', SIZE = 1mb)
GO
ALTER DATABASE [tempdb] MODIFY FILE (NAME='templog', FILENAME='L:\MSSQL\LOGS\templog.LDF', SIZE = 1mb)
GO

在上述示例中,我们只设置了1MB的文件大小,因为SQL Server的行为特殊。即使我们指示它使用不同的驱动器盘符,它也会在当前的TempDB驱动器上寻找这个数量的空闲空间。例如,如果SQL Server安装在服务器的C:驱动器上,并且我们尝试在T:驱动器上创建一个10GB的TempDB文件,那么如果C:驱动器上没有10GB的空闲空间,该SQL命令就会失败。

成功运行上述命令后,需要重新启动SQL Server实例。这将在新驱动器上创建新的TempDB文件。旧的TempDB文件必须从原始驱动器中手动删除,因为SQL Server本身不会执行此操作。

现在,TempDB已位于正确的驱动器上,请根据您的首选项将其扩展到完整的大小,然后使用上述规则(与处理器核心的数量相关)创建其他TempDB文件。如果您有一个具有4个插槽,且每个插槽有4个核心的核心盒(即总计16个核心),则建议使用4到8个TempDB文件。

如需创建另一个TempDB数据文件,必须运行以下命令:

USE [master]
GO
ALTER DATABASE [tempdb] ADD FILE (NAME = 'tempdev2', FILENAME='T:\MSSQL\DATA\tempdev2.ndf', SIZE = 10GB, FILEGROWTH = 0)
GO

必须强调的是,文件增长功能尚未启用。您应该主动以完整的大小创建TempDB文件,以避免驱动器碎片化。如果您有一个双CPU四核服务器(总计8个核心)和一个用于TempDB数据的80GB数组,那么您应该为TempDB创建8个10GB的文件。这样,每个文件都将是连续的。如果您将它们创建为较小的文件并让它们自动增长,那么磁盘将会被碎片化,因为这些文件将随机增长。此外,如果某个TempDB文件的增长速度比其他文件快,那么您最终可能会得到不同大小的TempDB文件。这就是为什么我们强烈建议预先增长所有的TempDB文件,然后以正确的大小获取它们。