To achieve optimal tempdb performance, create multiple tempdb data file per processor core and limit the number of tempdb data files up to 8 if you have more than 8 CPU core. Key benefit of creating multiple tempdb per core is it enables SQL to split the I/O transactions across each data files and also prevent blocking when multiple CPU processors perform SQL operation simultaneously.
- Log into SQL via SQL Server Management Studio
- Click on New Query -> On the query page copy and paste the script at the end of the post -> click the blue check sign to validate the script -> click Execute if validation passed
- When the script runs successfully -> The Messages section would display number of tempdb files now available. This VM has 2 CPUs so 1 additional tempdb file created.
- To verify the additional tempdb -> Right-click tempdb under System Databases and click properties ->Click Files and notice the additional tempdev2 created with same file size.
Note: If you have more than 8 tempdb data files created, delete the data files after the eight (i.e. tempdev9 and above) by simply selecting each file and click remove.
Split SQL TempDB Script
USE master GO CREATE TABLE #numprocs ( [Index] INT, [Name] VARCHAR(200), Internal_Value VARCHAR(50), Character_Value VARCHAR(200) ) DECLARE @BASEPATH VARCHAR(200) DECLARE @PATH VARCHAR(200) DECLARE @SQL_SCRIPT VARCHAR(500) DECLARE @CORES INT DECLARE @FILECOUNT INT DECLARE @SIZE INT DECLARE @GROWTH INT DECLARE @ISPERCENT INT INSERT INTO #numprocs EXEC xp_msver SELECT @CORES = Internal_Value FROM #numprocs WHERE [Index] = 16 PRINT @CORES 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) PRINT @BASEPATH SET @FILECOUNT = (SELECT COUNT(*) FROM master.sys.master_files WHERE database_id = 2 AND TYPE_DESC = '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 WHILE @CORES > @FILECOUNT BEGIN SET @SQL_SCRIPT = 'ALTER DATABASE tempdb ADD FILE ( FILENAME = ''' + @BASEPATH + 'tempdb' + RTRIM(CAST(@CORES as CHAR)) + '.ndf'', NAME = tempdev' + RTRIM(CAST(@CORES as CHAR)) + ', SIZE = ' + RTRIM(CAST(@SIZE as CHAR)) + 'MB, FILEGROWTH = ' + RTRIM(CAST(@GROWTH as CHAR)) IF @ISPERCENT > 0 SET @SQL_SCRIPT = @SQL_SCRIPT + '%' SET @SQL_SCRIPT = @SQL_SCRIPT + ')' EXEC(@SQL_SCRIPT) SET @CORES = @CORES - 1 END GO DROP TABLE #numprocs |
---|