你們好,我是悟空。本篇給你們介紹 TempDB 的使用和性能問題總結。sql
1、TempDB是什麼?
1.TempDB是一個系統數據庫。從SQL Server2000開始就一直存在。數據庫
2.只有Simple恢復模式、自動截斷模式。性能優化
3.存放局部變量/全局臨時表/表變量/臨時用法(如hash表等)。服務器
4.機器重啓或SQL Server服務重啓後,都會按照Model庫的配置從新建立。session
5.若是臨時對象是在會話或存儲過程範圍內產生的,在會話結束後就會自動回收,不能再查詢或使用。併發
6.默認狀況下都具備訪問權限。函數
2、TempDB用來存放什麼?
2.1.用戶臨時對象
(1)由用戶再會話中顯示建立的實體表和上面的索引。重啓後清空。性能
(2)全局臨時表+索引。##開頭的表。大數據
(3)局部臨時表及上面的索引。#開頭的表。優化
(4)表變量。@開頭。
注意:
(1)全局臨時表對全部會話均可見。當建立臨時表的會話斷開數據庫的聯接,並且也沒有活動再引用全局臨時表時,SQL Server會自動刪除相應的全局臨時表。
(2)局部臨時表只對建立它的會話再建立級和調用堆棧內部級(內部的過程、函數、觸發器、以及動態批處理)是可見的。當建立例程彈出調用堆棧,SQL Server就會自動刪除相應的臨時表
(3)表變量在tempdb數據庫中也有對應的表做爲其物理表示。只對當前會話的批處理可見。對調用堆棧中當前批處理的內部批處理是不可見的,對會話中隨後的批處理也是不可見的。
(4)根據國外專家的經驗,對於大數據,偏向使用臨時表,小數據量(通常來講小於100行)則可使用表變量。
|
是否具備統計信息 |
是否能夠建立索引 |
是不是物理存儲 |
臨時表 |
Y |
Y |
Y |
表變量 |
N |
N |
N |
2.2.內部臨時對象
在查詢過程當中存儲臨時數據的對象,如Sorts、假脫機、Hash關聯和遊標等。
可使用下面的SQL語句進行查看:
SELECT * FROM sys.dm_db_session_space_usage
查看internal_object_alloc_page_count列
2.3.版本存儲
開啓樂觀併發模式後,會使用Temp DB存放修改前的版本數據。
注意:
版本存儲將會形成Temp DB的非預期增加,須要對Temp DB的文件大小及使用空間進行監控。
3、TempDB上的存在的性能問題
3.1 空間使用狀況
TempDB是系統數據庫,被不少地方用到,若是配置和使用不當,空間會被迅速消耗,可能出現報錯,影響服務器的正常運行。
查看TempDB的空間使用狀況。
3.1.1 能夠用性能監視器看下SQL server的空間使用狀況。
3.1.2 用SQL語句查詢空間使用狀況。
(1)查看tempdb的使用狀況
Exec sp_spaceused
(2)查看tempdb.mdf文件的大小
SELECT * FROM dbo.sysfiles
(3)查看tempdb的使用空間
SELECT * FROM sys.dm_db_file_space_usage
(4)查看會話的空間分配狀況,不包含當前活動的任務。
SELECT * FROM sys.dm_db_session_space_usage WHERE session_id > 50
(5)查看TempDB中當前運行任務的信息。
SELECT * FROM sys.dm_db_task_space_usage WHERE session_id > 50
3.1.3 診斷TempDB磁盤問題
錯誤 |
引起錯誤的狀況 |
1101 或 1105 |
任何會話都必須分配 tempdb 中的空間。 |
3959 |
版本存儲區已滿。此錯誤在日誌中一般出如今錯誤 1105 或 1101 以後。 |
3967 |
因爲 tempdb 已滿,版本存儲區被強制收縮。 |
3958 或 3966 |
事務在 tempdb 中找不到所需的版本記錄。 |
3.2 I/O問題
(1)用函數sys.dm_io_virtual_file_stats查看當前實例上的TempDB上的磁盤讀寫狀況。
SELECT DB_NAME(database_id) AS 'Database Name' , file_id , io_stall_read_ms / num_of_reads AS 'AVG Read Transfer/ms' , io_stall_write_ms / num_of_writes AS 'AVG Write Transfer/ms' , * FROM sys.dm_io_virtual_file_stats(-1, -1) WHERE num_of_reads > 0 AND num_of_writes > 0
參考時間:10~20ms 可接受的範圍。
(2)大量、頻繁地建立和刪除臨時表及表變量
4、優化TempDB
1.配置文件的大小
默認配置:
初始大小8M
自動增加10%,不限制增加。
這個配置能夠修改,要視生產環境的狀況而修改。
建議以下配置
tempdb 文件大小 |
FILEGROWTH 增量 |
0 至 100 MB |
10 MB |
100 至 200 MB |
20 MB |
200 MB 或更多 |
10%* |
2.存放文件的地方
通常要將TempDB的文件單獨放到一個磁盤中。若是追求性能,考慮放到RAID0,可是不具備容災性。
RAID:磁盤陣列
RAID 0 無奇偶校驗的條帶磁盤。數據橫跨全部的物理磁盤,無任何容災特性。
RAID 1 磁盤鏡像。最少須要兩個物理磁盤。可同時從兩個磁盤讀取數據,寫數據須要備份到另一個盤。具備容災特性。浪費50%的磁盤空間。
RAID 5 具備奇偶校驗的條帶磁盤。最少須要3個物理磁盤,一個用來存放奇偶校驗信息,另外兩個用來存放數據,。具備容災特性。浪費50%的磁盤空間。
RAID 10 或RIAD 0+1 組合。讀寫性能最好且具備容災性。
3.文件的個數
TempDB只有一個primary文件組,全部的數據文件都會存放到這個文件組中。常規建議是4個書文件開始,而且須要進行監控,若是發現不夠,能夠再增長4個。依次類推。建議將文件個數控制再兩位數之內。
5、其餘
1.不能對TempDB執行什麼操做
- 添加文件組。
- 備份或還原數據庫。
- 更改排序規則。默認排序規則爲服務器排序規則。
- 更改數據庫全部者。tempdb 的全部者是 dbo。
- 建立數據庫快照。
- 刪除數據庫。
- 從數據庫中刪除 guest 用戶。
- 啓用變動數據捕獲。
- 參與數據庫鏡像。
- 刪除主文件組、主數據文件或日誌文件。
- 重命名數據庫或主文件組。
- 運行 DBCC CHECKALLOC。
- 運行 DBCC CHECKCATALOG。
- 將數據庫設置爲 OFFLINE。
- 將數據庫或主文件組設置爲 READ_ONLY。
二、查看TempDB的配置項
SELECT * FROM sys.databases WHERE name = 'tempdb'
參考資料:
https://msdn.microsoft.com/zh-cn/library/ms176029(v=sql.105).aspx
https://msdn.microsoft.com/zh-cn/library/ms345368(v=sql.105).aspx
https://msdn.microsoft.com/zh-cn/library/ms190768(v=sql.105).aspx
《SQL Server 性能優化與管理的藝術》
本文同步分享在 博客「7年一線互聯網經驗,超愛圖解底層原理,全棧一枚」(CNBlog)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。