对多个 tempdb 文件的建议

Raf*_*ima 6 sql-server sql-server-2012 tempdb

我想tempdb分成两个大小相同的文件,以提高数据库的性能。

我想知道这两个数据文件是否可以在同一个磁盘上,与日志和用户数据文件分开?

Joh*_* N. 6

我们在我们的商店有各种安装,我们倾向于从四个 tempdb 文件开始,然后添加其他文件,如果 @Kevin3nfs 评论指出存在 tempdb 争用,他引用了 SQLSkills.com 搜索。

Microsoft 有一篇知识库文章:减少 SQL Server tempdb 数据库中的分配争用的建议

[...]
作为一般规则,如果逻辑处理器的数量小于或等于 8,则使用与逻辑处理器相同数量的数据文件。如果逻辑处理器的数量大于 8,则使用 8 个数据文件,然后如果争用继续,则将数据文件的数量增加 4 的倍数(最多达到逻辑处理器的数量),直到争用减少到可接受的水平或使对工作负载/代码的更改。
[...]

SQLSKills.com 有一篇很好的文章The Accidental DBA(第 27 天,共 30 天):故障排除:Tempdb 争用,其中包含一些有关 tempdb 争用的一般信息,以及一个脚本,该脚本将从某些 DMV 检索有关 tempdb 争用的信息。

[...]
世界各地的 SQL Server 实例中存在的最常见的性能问题之一称为 tempdb 争用。这意味着什么?

Tempdb 争用是指线程试图访问内存中的分配页的瓶颈;它与 I/O 无关。

考虑数百个并发查询的场景,这些查询都创建、使用然后删除小型临时表(就其本质而言,它们总是存储在 tempdb 中)。每次创建临时表时,都必须分配一个数据页,以及一个分配元数据页来跟踪分配给该表的数据页。这需要在分配页面(称为 PFS 页面 - 请参阅此处了解详细信息)中注明这两个页面已在数据库中分配。当临时表被删除时,这些页面被释放,并且必须再次在该 PFS 页面中标记它们。一次只有一个线程可以更改分配页面,使其成为热点并减慢整体工作负载。[...]

下面是我们用于非常大的数据库服务器配置的脚本。它创建了一个包含 8 个 11GB 文件且没有自动增长的 tempdb 和一个 11GB 的 tempdb 事务日志文件。该脚本可以根据您的要求进行调整。

USE [master]
GO
ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'tempdev',FILENAME = N'G:\tempdb.mdf' , SIZE = 12288000KB , MAXSIZE = UNLIMITED, FILEGROWTH = 0 )
GO
ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev2', FILENAME = N'G:\tempdb2.ndf' , SIZE = 12288000KB , MAXSIZE = UNLIMITED, FILEGROWTH = 0 )
GO
ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev3', FILENAME = N'G:\tempdb3.ndf' , SIZE = 12288000KB , MAXSIZE = UNLIMITED, FILEGROWTH = 0 )
GO
ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev4', FILENAME = N'G:\tempdb4.ndf' , SIZE = 12288000KB , MAXSIZE = UNLIMITED, FILEGROWTH = 0 )
GO
ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev5', FILENAME = N'G:\tempdb5.ndf' , SIZE = 12288000KB , MAXSIZE = UNLIMITED, FILEGROWTH = 0 )
GO
ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev6', FILENAME = N'G:\tempdb6.ndf' , SIZE = 12288000KB , MAXSIZE = UNLIMITED, FILEGROWTH = 0 )
GO
ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev7', FILENAME = N'G:\tempdb7.ndf' , SIZE = 12288000KB , MAXSIZE = UNLIMITED, FILEGROWTH = 0 )
GO
ALTER DATABASE [tempdb] ADD FILE ( NAME = N'tempdev8', FILENAME = N'G:\tempdb8.ndf' , SIZE = 12288000KB , MAXSIZE = UNLIMITED, FILEGROWTH = 0 )
GO
ALTER DATABASE [tempdb] MODIFY FILE ( NAME = N'templog', FILENAME = N'G:\templog.ldf' , SIZE = 12288000KB , MAXSIZE = UNLIMITED, FILEGROWTH = 0 )
Run Code Online (Sandbox Code Playgroud)

如您所见,这些文件都位于同一驱动器上。

如果您仍然注意到tempdb数据库中的争用,那么将tempdb数据库文件拆分到不同的磁盘上可能是一个可能的解决方案,但这取决于您的配置(SAN、SSD...),并且必须通过测试进行验证。