What is the tempdb database?
tempdb
is one of the system databases in Microsoft SQL Server.
It’s a global resource that holds temporary user objects, row versioning information, and internal objects created by the SQL Server Engine.
SQL Server creates a clean copy of the tempdb
every time the instance is started.
Why should you care about it?
tempdb
affects the performance of all SQL Server.
Many background processes use tempdb
.
If it does not perform optimally, all databases are affected and will slow the whole server down.
Using tempdb
best practices will (most likely) increase your database performance.
How do you adjust tempdb for the best performance?
- Check the number of data files.
SQL Server by default configuration has a single data file fortempdb
.
Microsoft’s best practices recommend increasing the number of data files to maximize disk bandwidth and reduce contention.
You can use the script below to verify and generate the change script for your server.
Change the variable@check
to 1 to implement the change. The default value 0 only shows the information.
DECLARE @check BIT
SET @check = 0 --For information set 0, for change 1
DECLARE @BASEPATH NVARCHAR(300)
DECLARE @SQL_SCRIPT NVARCHAR(1000)
DECLARE @CORES INT
DECLARE @FILECOUNT INT
DECLARE @SIZE INT
DECLARE @GROWTH INT
DECLARE @ISPERCENT INT
-- TempDB mdf count equal logical cpu count
SELECT @CORES = cpu_count
FROM sys.dm_os_sys_info
PRINT 'Logical CPU count ' + CAST(@CORES AS NVARCHAR(100))
IF @CORES BETWEEN 9 AND 31
SET @CORES = @CORES / 2
IF @CORES & gt;= 32
SET @CORES = @CORES / 4
--Check and set tempdb files count are multiples of 4
IF @CORES & gt;8
SET @CORES = @CORES - (@CORES % 4)
SET @BASEPATH = (
SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'tempdb.mdf', LOWER(physical_name)) - 1) DataFileLocation
FROM master.sys.master_files
WHERE database_id = 2
AND FILE_ID = 1
)
SET @FILECOUNT = (
SELECT COUNT(*)
FROM master.sys.master_files
WHERE database_id = 2
AND TYPE_DESC = N'ROWS'
)
SELECT @SIZE = size
FROM master.sys.master_files
WHERE database_id = 2
AND FILE_ID = 1
SET @SIZE = @SIZE / 128
SELECT @GROWTH = growth
FROM master.sys.master_files
WHERE database_id = 2
AND FILE_ID = 1
SELECT @ISPERCENT = is_percent_growth
FROM master.sys.master_files
WHERE database_id = 2
AND FILE_ID = 1
IF @ISPERCENT = 0
SET @GROWTH = @GROWTH * 8
--Current situation
PRINT 'Needed ' + CAST(@CORES AS NVARCHAR(100)) + ' TempDB data files, now there is ' + CAST(@FILECOUNT AS NVARCHAR(100)) + CHAR(10) + CHAR(13)
IF @check = 1
AND @CORES & gt; @FILECOUNT
PRINT 'Commands listed below will be executed' + CHAR(10) + CHAR(13)
IF @check = 0
AND @CORES & gt; @FILECOUNT
PRINT 'Commands listed below will NOT be executed' + CHAR(10) + CHAR(13)
WHILE @CORES & gt; @FILECOUNT
BEGIN
SET @SQL_SCRIPT = N'ALTER DATABASE tempdb
ADD FILE (
FILENAME = ''' + @BASEPATH + 'tempdb' + RTRIM(CAST(@CORES AS NCHAR)) + '.ndf'',
NAME = tempdev' + RTRIM(CAST(@CORES AS NCHAR)) + ',
SIZE = ' + RTRIM(CAST(@SIZE AS NCHAR)) + 'MB,
FILEGROWTH = ' + RTRIM(CAST(@GROWTH AS NCHAR))
IF @ISPERCENT = 1
SET @SQL_SCRIPT = @SQL_SCRIPT + '%'
ELSE
SET @SQL_SCRIPT = @SQL_SCRIPT + 'KB'
SET @SQL_SCRIPT = @SQL_SCRIPT + ')'
IF @check = 1
EXEC (@SQL_SCRIPT)
PRINT @SQL_SCRIPT
SET @CORES = @CORES - 1
END
Note: SQL Server 2016 has a built-in feature that detects the number of CPU cores and automatically creates the appropriate amount of tempdb
data files.
- Review the size and autogrow settings.
Set the right size (you can start with 10GB) and adjust the autogrow settings to a fixed value.
Here is a post on how to change auto growth settings. Don’t use percentages. - Use a dedicated Hard Disk Drive (HDD).
Most high-performance SQL Servers placetempdb
on a dedicated disk drive.
Do that if you can. - Use trace flags T1117 & T1118.
They will helptempdb
to perform faster. Check out our post about trace flags.
Note: Microsoft made this behavior standard in SQL Server 2016 and newer versions.