【T-SQL性能優化】01.TempDB的使用和性能問題


本系列【T-SQL基礎】主要是針對T-SQL基礎的總結。

【T-SQL基礎】01.單表查詢-幾道sql查詢題

【T-SQL基礎】02.聯接查詢

【T-SQL基礎】03.子查詢

【T-SQL基礎】04.表表達式-上篇

【T-SQL基礎】04.表表達式-下篇

【T-SQL基礎】05.集合運算

【T-SQL基礎】06.透視、逆透視、分組集

【T-SQL基礎】07.數據修改

【T-SQL基礎】08.事務和並發

【T-SQL基礎】09.可編程對象

 ----------------------------------------------------------

【T-SQL進階】01.好用的SQL TVP~~獨家贈送[增-刪-改-查]的例子

 ----------------------------------------------------------

【T-SQL性能調優】01.TempDB的使用和性能問題

【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/
關於作者:專注於微軟平台的項目開發。如有問題或建議,請多多賜教!
版權聲明:本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。
特此聲明:所有評論和私信都會在第一時間回復。也歡迎園子的大大們指正錯誤,共同進步。或者直接私信
聲援博主:如果您覺得文章對您有幫助,可以點擊文章右下角推薦一下。您的鼓勵是作者堅持原創和持續寫作的最大動力!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM