TempDB可以想像是SQL Server放在硬碟的暫存檔一樣,
除了在記憶體不足時將會使用TempDB來做運算之外,
在其它SQL Server會使用到TempDB的情況如下:
1.在下SQL Query時使用Group by, Order by,Union,distinct,sort等。
2.最常見的是Query中使用暫存表(#table_name or ##table_name)來做運算,切記使用後記得要drop暫存表以免TempDB愈長愈大。
3.rebuild index,DBCC checkDB以及使用cursor時。
如何觀察TempDB是否引起IO latch?
有時侯在查看活動監視器時會發現CPU Loading會拉高到80%以上並持續一段時間,
此時可以輸入以下SQL Query來看是不是太多DB在等待使用TempDB,因而導致CPU在等待IO回應。
Select session_id, wait_type, wait_duration_ms, resource_description
From sys.dm_os_waiting_tasks
Where
(wait_type like 'pagelatch_%' or wait_type like 'pageiolatch_%') and resource_description like '2:%'
那麼該如何減少多個DB去搶TempDB的資源的情況發生呢?
依照微軟的建議的作法,需要依照該台主機的CPU總Core數/2的數量來建立TempDB資料檔案,
例如總共有8 Core/2則要建立4個TempDB資料檔案,其建立的Script如下:
USE [master]
GO
ALTER DATABASE [tempdb] ADD FILE ( NAME = N'temp2',
FILENAME = N'E:\Program Files\Microsoft SQL Server 2016\MSSQL13.MSSQL2K16\MSSQL\DATA\temp2.ndf' ,
SIZE = 8192KB , FILEGROWTH = 65536KB )
GO
ALTER DATABASE [tempdb] ADD FILE ( NAME = N'temp3',
FILENAME = N'E:\Program Files\Microsoft SQL Server 2016\MSSQL13.MSSQL2K16\MSSQL\DATA\temp3.ndf' ,
SIZE = 8192KB , FILEGROWTH = 65536KB )
GO
--⋯⋯⋯⋯⋯⋯以此類推下去
TempDB如果要加強讀寫速度,建議可以規劃將檔案分散建立在不同的硬碟。
沒有留言:
張貼留言