SQL Server 資料庫引擎依賴兩類核心檔案:資料檔(.mdf/.ndf)與交易記錄檔(.ldf)。它們的物理放置位置、磁碟子系統選型、檔案群組規劃,直接決定了查詢效能、備份/還原速度、高可用性 RPO/RTO 以及擴容彈性。忽視檔案層面規劃,往往導致上線後被迫停機遷移、甚至資料遺失風險。本文系統梳理檔案配置的黃金法則。
| 特性 | 資料檔 (Data File) | 記錄檔 (Log File) |
|---|---|---|
| 儲存內容 | 資料頁、索引頁、系統目錄、大型物件 | 交易記錄:INSERT/UPDATE/DELETE 操作的重做/回滾資訊 |
| 存取模式 | 隨機讀寫(OLTP)、順序掃描(OLAP) | 嚴格順序寫入,極少讀取(僅恢復/複寫/鏡像時) |
| I/O 特徵 | 8 KB 頁為單位,隨機 IOPS 敏感 | 連續寫入,吞吐量敏感,延遲極度敏感 |
| 增長模式 | 隨資料增長緩慢增長 | 高頻交易下極快增長,需預留空間 |
| RAID 建議 | RAID 5/6(成本導向)或 RAID 10(效能導向) | RAID 1/10 唯一推薦,嚴禁 RAID 5/6 |
資料檔與記錄檔必須放在獨立的物理磁碟/磁碟陣列上。 混放會導致:
- 隨機 I/O 干擾順序寫入,記錄檔寫入延遲飆升 → 交易提交變慢 → 鎖持有時間變長 → 並發度下降
- 單一磁碟故障同時損壞資料與記錄 → 無法執行「尾部記錄備份」 → 資料遺失(RPO > 0)
TempDB 承載臨時表、表變數、排序溢寫、版本存放區等高強度混合 I/O。建議:
-- 建立檔案群組
ALTER DATABASE FinanceDB ADD FILEGROUP FG_Indexes;
ALTER DATABASE FinanceDB ADD FILEGROUP FG_Archive;
-- 新增檔案到對應群組(預設大小 4GB,自動增長 512MB)
ALTER DATABASE FinanceDB ADD FILE (
NAME = 'Finance_Idx01',
FILENAME = 'F:\SQLData\Indexes\Finance_Idx01.ndf',
SIZE = 4GB,
FILEGROWTH = 512MB
) TO FILEGROUP FG_Indexes;
ALTER DATABASE FinanceDB ADD FILE (
NAME = 'Finance_Arc01',
FILENAME = 'H:\SQLArchive\Finance_Arc01.ndf',
SIZE = 10GB,
FILEGROWTH = 1GB
) TO FILEGROUP FG_Archive;
-- 索引建立指定檔案群組
CREATE NONCLUSTERED INDEX IX_Orders_CustDate
ON dbo.Orders (CustomerID, OrderDate)
WITH (DATA_COMPRESSION = PAGE)
ON FG_Indexes; -- 關鍵:放入索引專用群組
記錄檔內部劃分為虛擬記錄檔 (VLF)。過多/過小 VLF 會拖慢啟動恢復、備份、AlwaysOn 同步。
| 檢查項 | 標準 | 驗證方式 |
|---|---|---|
| 資料/記錄檔物理隔離 | 不同磁碟/陣列/LUN | sys.master_files + 儲存陣列拓撲 |
| 記錄檔 RAID 級別 | RAID 1/10 | 儲存管理員確認 |
| TempDB 專屬磁碟 | 獨立 SSD/RAID 10 | sys.master_files where database_id=2 |
| 自動增長單位 | 固定 MB/GB,非百分比 | sys.master_files is_percent_growth=0 |
| IFI 啟用 | 服務帳號有 SeManageVolumePrivilege | SQL 錯誤日誌 "Database Instant File Initialization: enabled" |
| 檔案群組分層 | 熱/冷/索引/LOB 分離 | sys.filegroups + 表/索引 ON 子句 |
| 磁碟剩餘空間 | > 20% 或 > 100GB | 監控系統/巡檢腳本 |
SQL Server 檔案配置不是「安裝完就不管」的基礎設施,而是贯穿資料庫全生命週期的效能杠桿。牢記三大鐵律:
配合檔案群組分層與 TempDB 專屬優化,即可構建高效能、高可用、易擴展的儲存基石。