執行大量資料查詢時,SQL Server 會在 TEMP 目錄建立 .tmp 暫存檔儲存中間結果。本文深入剖析 TMP 檔案儲存格式、大小估算、對查詢效能的影響,以及為何必須將 TEMP 目錄置於 NTFS 分區且預留充足空間。
TEMP / TMP 指定的資料夾(通常 C:\Windows\Temp 或使用者設定檔下)。≤255 字元 → 1 byte;>255 → 5 bytes。SELECT 1, CAST(1 AS BIGINT), 'ab', GETDATE()產生的 TMP 檔案十六進位內容:
04 01 00 00 00 -- INT 1 (長度4 + 值1)
08 01 00 00 00 00 00 00 00 -- BIGINT 1 (長度8 + 值1)
04 61 00 62 00 -- 'ab' (長度4 + Unicode 'a''b')
08 60 73 C2 02 7A 7B CB 08 -- GETDATE() (長度8 + 二進位日期時間)
對於 SELECT * FROM table,TMP 檔依欄位順序依序寫入:
[id長度][id資料][dtcol長度][dtcol資料][charcol長度][charcol資料][maxcol長度][maxcol資料]...
字元型欄位 (CHAR/VARCHAR/TEXT/MAX) 皆轉 Unicode 儲存,佔用雙倍空間。
假設表結構:id(INT)、dtcol(DATETIME)、charcol(CHAR 100)、maxcol(VARCHAR(MAX) 7200 bytes)
| 風險 | 現象 | 根因 | 對策 |
|---|---|---|---|
| 磁碟空間耗盡 | 查詢中斷、錯誤「磁碟空間不足」 | TEMP 所在分區剩餘空間 < TMP 檔案需求 | 將 TEMP 移至大容量分區、定期清理、監控空間使用率 |
| FAT32 4GB 單檔限制 | TMP 檔長到 4GB 即停止增長,查詢失敗 | FAT32 最大檔案 4GB,SQL Server 不會自動分割 | TEMP 必須置於 NTFS 分區 |
SELECT *、大量文字欄位查詢、無條件全表掃描;使用分頁、篩選、投影減少中間結果集。Performance Monitor → SQL Server:TempDB → Temp Tables Creation Rate / Temp Tables For Destruction Rate。理解 TMP 暫存檔機制,並從儲存層面規劃 TEMP 環境,是防止大查詢失敗、穩定 SQL Server 效能的關鍵基建工作。