Quantcast
Channel: Sysadmins Knowledge Base » Microsoft SQL Server
Viewing all articles
Browse latest Browse all 12

Split SQL TempDB per number of Processor Core

$
0
0

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

Viewing all articles
Browse latest Browse all 12

Trending Articles