接續上篇「分區表建立」,本文實戰演示分區表的 **資料操作(CRUD)**、**分區判斷函數 $PARTITION**、**各分區統計**,以及 **跨分區更新的自動資料移動** 行為,驗證「邏輯一張表、物理多檔案」的透明特性。
-- 沿用上篇分區表 dbo.Sale (Id, Name, SaleTime)
-- 分區函數 pf_SaleDate: RANGE RIGHT '20100101','20110101','20120101','20130101'
-- 對應 5 個分區:<2010 | 2010 | 2011 | 2012 | ≥2013
INSERT INTO dbo.Sale (Name, SaleTime) VALUES
(N'張三','2009-01-01'), (N'李四','2009-02-01'), (N'王五','2009-03-01'), -- 分區 1
(N'錢六','2010-04-01'), (N'趙七','2010-05-01'), -- 分區 2
(N'張三','2011-06-01'), (N'李四','2011-07-01'), (N'王五','2011-08-01'), -- 分區 3
(N'錢六','2012-09-01'), (N'趙七','2012-10-01'), (N'張三','2012-11-01'), -- 分區 4
(N'李四','2013-12-01'), (N'王五','2014-12-01'); -- 分區 5
插入語法與普通表**完全相同**,開發者無需知道實體分區分佈。
SELECT * FROM dbo.Sale;
-- 正常回傳 13 筆資料,不感知分區存在
$PARTITION.()
INT 分區編號(1-based)。expression 型別必須與分區函數定義一致(本例為 DATETIME)。
SELECT $PARTITION.pf_SaleDate('2010-10-01'); -- 回傳 2
SELECT * FROM dbo.Sale WHERE $PARTITION.pf_SaleDate(SaleTime) = 2;
-- 僅回傳分區 2 的 2 筆資料
SELECT
$PARTITION.pf_SaleDate(SaleTime) AS PartitionNo,
COUNT(*) AS RowCount
FROM dbo.Sale
GROUP BY $PARTITION.pf_SaleDate(SaleTime);
PartitionNo RowCount
1 3
2 2
3 3
4 3
5 2
-- 1. 變更前統計
SELECT $PARTITION.pf_SaleDate(SaleTime) AS PNo, COUNT(*) AS Cnt
FROM dbo.Sale GROUP BY $PARTITION.pf_SaleDate(SaleTime);
-- 2. 將 Id=1 (原 2009-01-01, 分區1) 改為 2019-01-01 (應進分區5)
UPDATE dbo.Sale SET SaleTime = '2019-01-01' WHERE Id = 1;
-- 3. 變更後統計
SELECT $PARTITION.pf_SaleDate(SaleTime) AS PNo, COUNT(*) AS Cnt
FROM dbo.Sale GROUP BY $PARTITION.pf_SaleDate(SaleTime);
-- 變更前
PNo Cnt
1 3
2 2
3 3
4 3
5 2
-- 變更後
PNo Cnt
1 2 -- 少 1 筆
2 2
3 3
4 3
5 3 -- 多 1 筆
**完全透明**:開發者只需 UPDATE 邏輯欄位,SQL Server 自動處理跨分區資料移動(內部為 DELETE + INSERT),無須手工干預。
DELETE FROM dbo.Sale WHERE $PARTITION.pf_SaleDate(SaleTime) = 1; —— 可刪除特定分區資料,支援 OUTPUT、觸發器、記錄逐列寫入。TRUNCATE TABLE dbo.Sale; —— **不支援分區層級截斷**,會清空全表。若需快速清空單一分區,請用 SWITCH PARTITION ... TO staging_table 再 TRUNCATE staging_table。
-- 1. 建立結構完全相同的暫存表(含相同檔案群組、索引、檢查約束)
CREATE TABLE dbo.Sale_Staging (...) ON ps_SaleDate(SaleTime);
-- 2. 將分區 1 (2009 年資料) 切換出來
ALTER TABLE dbo.Sale SWITCH PARTITION 1 TO dbo.Sale_Staging;
-- 3. 現在 Sale_Staging 擁有該分區資料,Sale 分區 1 瞬間變空
-- 4. 可對 Sale_Staging 壓縮、移動、匯出、備份,不影響主表線上服務
UPDATE STATISTICS ... WITH RESAMPLE。DATA_COMPRESSION = PAGE,節省空間並減少 I/O。