關鍵關係:檔案組包含一或多個資料檔;資料表/索引建立時指定檔案組,資料即分散儲存於該組內的所有檔案中。
SELECT
df.name AS 邏輯檔名,
df.physical_name AS 實體路徑,
df.size * 8 / 1024.0 AS 大小_MB,
df.growth * 8 / 1024.0 AS 成長增量_MB,
fg.name AS 檔案組,
fg.is_default AS 是否預設組
FROM sys.database_files df
JOIN sys.filegroups fg ON df.data_space_id = fg.data_space_id;
| 類型 | 副檔名 | 說明 |
|---|---|---|
| 主要資料檔 | .mdf | 含資料庫啟動資訊、指向其他檔案,可存使用者資料。每庫僅一個。 |
| 次要資料檔 | .ndf | 可選,存使用者資料,可跨磁碟分散 I/O,突破單檔大小限制。 |
| 交易記錄檔 | .ldf | 存復原資訊,每庫至少一個。 |
CREATE DATABASE 或 ALTER DATABASE 建立,用於業務資料分組。ALTER DATABASE 變更。系統物件仍留在 PRIMARY。-- 1. 建立資料庫含三個次要檔案於不同磁碟
CREATE DATABASE Sales
ON PRIMARY (
NAME = Sales_Prim, FILENAME = 'C:\Data\Sales_Prim.mdf', SIZE = 100MB
),
FILEGROUP FG_Data (
NAME = Sales_Data1, FILENAME = 'D:\Data\Sales_Data1.ndf', SIZE = 500MB,
NAME = Sales_Data2, FILENAME = 'E:\Data\Sales_Data2.ndf', SIZE = 500MB,
NAME = Sales_Data3, FILENAME = 'F:\Data\Sales_Data3.ndf', SIZE = 500MB
)
LOG ON (
NAME = Sales_Log, FILENAME = 'G:\Log\Sales_Log.ldf', SIZE = 200MB
);
-- 2. 在檔案組 FG_Data 上建立大量資料表
CREATE TABLE BigOrders (
OrderID INT IDENTITY PRIMARY KEY,
CustID INT,
OrderDate DATETIME,
Amount MONEY
) ON FG_Data; -- 關鍵:指定檔案組
-- 3. 建立索引同樣可指定檔案組
CREATE INDEX IX_BigOrders_CustID ON BigOrders(CustID) ON FG_Data;
此架構下,BigOrders 的資料與索引自動輪流寫入三個 .ndf,查詢時並行讀取三顆磁碟,效能提升顯著。
FILEGROWTH 固定 MB 值(如 512MB),避免百分比成長造成不可控的擴展暫停。
4. 定期監控 sys.dm_io_virtual_file_stats 識別熱點檔案,動態調整檔案組佈局。
檔案組是 SQL Server 實現儲存彈性與 I/O 平行化的核心機制。合理規劃 .mdf/.ndf/.ldf 佈局與檔案組歸屬,能從架構層面解決容量上限與效能瓶頸,是大型資料庫設計的必修功課。