此篇是有關於 SQL 中 tempDB 的概念及壓縮方式
tempdb 概念
其實就和系統中的 temp 一樣是一個暫時存在的空間,通常用來存放用來運算的資料或暫時存在的資料。
由於類似緩存的空間在預設裝起來的時候並沒有特別限制 tempdb 的大小,在長期使用後通常 tempdb 都會非常肥大。
從 MSDN 看到如果要最佳化 tempdb 則可以讓每個資料庫擁有自己的 tempdb,並且依照每個資料庫的運算屬性去調配大小。
tempdb 壓縮實作
因為今天在處理一台 Server 因為空間非常的不足,導致常常要檢查磁碟空間不要爆滿,但因為這台 Server 因系統上線進行轉換大量的資料,所以也抓不準其他人在使用中會產生什麼資料讓磁碟空間爆滿,最後採用定期檢查的方式解決這個過渡時期。
轉換的資料大多是 SQL ,所以在 Log 的成長必須要有所限制。在今天則發現 tempdb 非常的肥大,所以特別紀錄此篇壓縮實例
一般壓縮
在一般的狀況中可以使用 SSMS 工具的壓縮功能釋放 tempdb
tempdb 右鍵→「工作」→「壓縮」→「資料庫」
並勾選【釋放未使用空間之前重新組織檔案。】進行釋放。一般可以釋放出好幾G的空間。
進階壓縮
使用 SSMS 的壓縮功能是最安全的,但相對的壓縮的量並沒有那麼有效果,在使用此方式時建議將AP的服務停止,使其不要再對資料庫有 connection。
因為此種方式將會強制釋放占用的記憶體,若是在線上中的系統有在進行資料運算,難保會有 connection 被中斷造成問題。
-- 避免還有資料還在記憶體內,執行 Checkpoint 建立手動檢查點。 Checkpoint GO -- 強制釋放佔用的記憶體 DBCC FREESYSTEMCACHE ('ALL') DBCC FREEPROCCACHE DBCC DROPCLEANBUFFERS DBCC FREESESSIONCACHE GO -- 執行壓縮指令 DBCC SHRINKDATABASE(N'tempdb')
此時應該釋放了大量的空間
但要解決還是必須從根本產生 tempdb 的問題來看
參考資料
http://www.dotblogs.com.tw/jamesfu/archive/2014/05/20/shrinktempdb.aspx