當單表資料超過百萬筆,且查詢/維運呈現明顯的「熱/冷資料」特徵(如:近三個月頻繁讀寫,歷史資料唯讀查詢),**分區表** 能在不修改應用程式碼的前提下,大幅提升查詢效能與維運彈性。本文完整演示從檔案群組規劃、分區函數/方案建立、到分區表建立的全流程。
| 條件 | 判斷標準 |
|---|---|
| 資料量 | 單表 > 100 萬筆(視硬體而定,查詢明顯變慢即考慮) |
| 存取模式 | 明顯的範圍存取:如按月/年/區間查詢,歷史資料極少修改 |
| 維運需求 | 需快速歸檔、切換、備份特定區間資料 |
若全表皆為熱資料(均勻高頻存取),分區反而增加開銷,不建議使用。
ON PartitionScheme(PartitionColumn),邏輯上仍是單一表。Sale2009、Sale2010、Sale2011、Sale2012、Sale2013。
ALTER DATABASE SalesDB ADD FILEGROUP Sale2009;
ALTER DATABASE SalesDB ADD FILEGROUP Sale2010;
-- ... 依序新增群組
ALTER DATABASE SalesDB
ADD FILE (NAME='Sale2009_data', FILENAME='D:\Data\Sale2009.ndf', SIZE=1GB, FILEGROWTH=512MB)
TO FILEGROUP Sale2009;
-- ... 依序新增檔案至對應群組
CREATE PARTITION FUNCTION pf_SaleDate (DATETIME)
AS RANGE RIGHT FOR VALUES ('20100101','20110101','20120101','20130101');
| 選項 | 含義 | 本例分區結果 |
|---|---|---|
| RANGE RIGHT | 界點值屬於**右側**分區 |
分區 1: < 2010-01-01 分區 2: 2010-01-01 ≤ x < 2011-01-01 分區 3: 2011-01-01 ≤ x < 2012-01-01 分區 4: 2012-01-01 ≤ x < 2013-01-01 分區 5: ≥ 2013-01-01 |
| RANGE LEFT | 界點值屬於**左側**分區 | 分區界線左移一天,2010-01-01 歸屬分區 1 |
日期字面值建議用 YYYYMMDD 格式,避免語系/日期格式設定導致解析錯誤。
CREATE PARTITION SCHEME ps_SaleDate
AS PARTITION pf_SaleDate
TO (Sale2009, Sale2010, Sale2011, Sale2012, Sale2013);
CREATE TABLE dbo.Sale (
Id INT IDENTITY(1,1) NOT NULL,
Name VARCHAR(16) NOT NULL,
SaleTime DATETIME NOT NULL
-- 注意:分區表**不可再建立叢集索引**,分區鍵隱含排序
) ON ps_SaleDate(SaleTime);
ON ps_SaleDate(SaleTime) 指定分區方案與分區欄位。
-- 檢視表屬性
SELECT * FROM sys.tables WHERE name = 'Sale' AND is_partitioned = 1;
-- 檢視分區細節
SELECT
p.partition_number,
f.name AS filegroup,
p.rows,
prv.value AS boundary_value
FROM sys.partitions p
JOIN sys.destination_data_spaces dds ON p.partition_number = dds.destination_id
JOIN sys.filegroups f ON dds.data_space_id = f.data_space_id
LEFT JOIN sys.partition_range_values prv ON prv.function_id =
(SELECT function_id FROM sys.partition_functions WHERE name = 'pf_SaleDate')
AND prv.boundary_id = p.partition_number
WHERE p.object_id = OBJECT_ID('dbo.Sale');
ALTER TABLE ... SWITCH PARTITION ... TO ... 秒級歸檔/載入百萬筆,無資料移動、無記錄寫入。| 誤區/限制 | 說明 |
|---|---|
| 分區鍵不在 PK 中 | 建表會報錯:PK 必須包含分區欄位,或改用非唯一叢集索引。 |
| 跨分區 UPDATE | UPDATE 導致分區鍵值變更會觸發資料移動(刪除+插入),大量跨分區更新效能差。 |
| 外鍵限制 | 參考分區表的 FK,參考表也必須同樣分區對齊,否則無法建立 FK。 |
| 計算欄位分區 | 支援持久化計算欄位做分區鍵。 |