本系列【T-SQL基礎】主要是針對T-SQL基礎的總結。
【T-SQL基礎】06.透視、逆透視、分組集
【T-SQL基礎】07.數據修改
【T-SQL基礎】09.可編程對象
----------------------------------------------------------
【T-SQL進階】01.好用的SQL TVP~~獨家贈送[增-刪-改-查]的例子
----------------------------------------------------------
【T-SQL性能調優】02.Transaction Log的使用和性能問題
【T-SQL性能調優】03.執行計划
【T-SQL性能調優】04.死鎖分析
持續更新......歡迎關注我!
一、TempDB是什么?
1.TempDB是一個系統數據庫。從SQL Server2000開始就一直存在。
2.只有Simple恢復模式。自動截斷模式。
3.存放局部變量/全局臨時表/表變量/臨時用法(如hash表等)。
4.機器重啟或SQL Server服務重啟后,都會按照Model庫的配置重新創建。
5.如果臨時對象是在會話或存儲過程范圍內產生的,在會話結束后就會自動回收,不能再查詢或使用。
6.默認情況下都具有訪問權限。
二、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的文件大小及使用空間進行監控。
三、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)大量、頻繁地創建和刪除臨時表及表變量
四、優化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個。依次類推。建議將文件個數控制再兩位數以內。
五、其他
1.不能對TempDB執行什么操作
- 添加文件組。
- 備份或還原數據庫。
- 更改排序規則。默認排序規則為服務器排序規則。
- 更改數據庫所有者。tempdb 的所有者是 dbo。
- 創建數據庫快照。
- 刪除數據庫。
- 從數據庫中刪除 guest 用戶。
- 啟用變更數據捕獲。
- 參與數據庫鏡像。
- 刪除主文件組、主數據文件或日志文件。
- 重命名數據庫或主文件組。
- 運行 DBCC CHECKALLOC。
- 運行 DBCC CHECKCATALOG。
- 將數據庫設置為 OFFLINE。
- 將數據庫或主文件組設置為 READ_ONLY。
2、查看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 性能優化與管理的藝術》
作 者: Jackson0714
出 處:http://www.cnblogs.com/jackson0714/
關於作者:專注於微軟平台的項目開發。如有問題或建議,請多多賜教!
版權聲明:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
特此聲明:所有評論和私信都會在第一時間回復。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信我
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角【推薦】一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!