| 操作 | 分區表 | 非分區表 | 提升 |
| INSERT 1500 萬筆 | ~X 秒 | ~3X 秒 | 3 倍快 |
| 範圍查詢(WHERE 日期範圍) | 嵌套迴圈 + 索引掃描(僅掃描相關分區) | 索引掃描(全表) | I/O 大幅降低 |
| 執行計畫差異 | 最佳化器識別分區,視為獨立表聯結 | 單一大表掃描 | 平行處理多個分區 |
分區切換:毫秒級歸檔與清除
核心語法
-- 將來源表分區切換至目標表分區(元資料操作,零資料移動)
ALTER TABLE source_table SWITCH PARTITION source_partition_num
TO target_table PARTITION target_partition_num
前置條件
- 來源/目標表結構完全相同(欄位、索引、約束、分區配置)
- 目標分區必須為空
- 資料值必須滿足目標分區邊界條件
- 雙方分區位於相同檔案群組
實戰:歸檔 2007 年資料至歷史表
-- 1. 建立歷史表,相同結構、相同分區配置,主鍵起始值避免衝突
CREATE TABLE fact_time_entry_history (...) ON ps_DateRange(EntryDate)
-- 2. 將 2007 年資料(分區 8)載入歷史表(可透過 ETL、INSERT、BCP)
-- ...載入完成...
-- 3. 毫秒級切換:將歷史表分區 8 切換至正式表分區 8
ALTER TABLE fact_time_entry_history SWITCH PARTITION 8
TO fact_time_entry PARTITION 8
-- 耗時:3 毫秒,正式表瞬間新增 500 萬筆,零鎖定、零阻塞查詢
實戰:清除 2004 年資料
-- 1. 確保歷史表分區 2 為空
-- 2. 將正式表分區 2 切換至歷史表分區 2
ALTER TABLE fact_time_entry SWITCH PARTITION 2
TO fact_time_entry_history PARTITION 2
-- 3. 截斷/刪除歷史表分區 2,或移至其他伺服器
TRUNCATE TABLE fact_time_entry_history -- 或 DROP PARTITION 2(需重建配置)
查詢分區資訊
-- 查看各分區資料筆數
SELECT
$PARTITION.pf_DateRange(EntryDate) AS PartitionNumber,
COUNT(*) AS RowCount
FROM fact_time_entry
GROUP BY $PARTITION.pf_DateRange(EntryDate)
ORDER BY PartitionNumber
分區索引維護策略
| 操作 | 語法 | 適用情境 |
| 重建單一分區 | ALTER INDEX idx ON tbl REBUILD PARTITION = 3 | 特定分區碎片嚴重,避免全表重建鎖定 |
| 重組單一分區 | ALTER INDEX idx ON tbl REORGANIZE PARTITION = 3 | 輕度碎片,線上操作 |
| 更新單一分區統計 | UPDATE STATISTICS tbl (idx) WITH RESAMPLE ON PARTITIONS(3) | 特定分區資料分布變化大 |
適用場景與限制
| 適用 | 不適用/限制 |
| 大型事實表、歷史資料表、記錄類資料表 | 小表(< 100 萬筆)維護成本大於收益 |
| 範圍查詢為主(日期、數值區間) | 隨機點查為主(分區剪枝無效) |
| 需要滾動視窗歸檔/清除 | 頻繁跨分區 JOIN/UPDATE(可能導致分區移動) |
| 檔案群組可對應不同儲存層級(SSD/HDD/冷存儲) | 外鍵參考分區表時,參考表也需分區對齊 |
結語
SQL Server 2005 分區技術將「手工分表+檢視表」升級為引擎原生支援,核心價值在於:
- 查詢效能: 自動分區剪枝、平行掃描
- 維護效能: 單一分區重建/重組/更新統計
- 資料生命週期:
SWITCH PARTITION 毫秒級歸檔/清除,零停機
掌握分區函數設計、檔案群組規劃、對齊索引原則與切換操作,是處理 TB 級資料倉庫的必備技能。
- 上一篇文章: SQL Server 圖像/二進位大物件 (BLOB) 儲存與存取機制全解析
- 下一篇文章: SQL Server 2005 執行內容切換:EXECUTE AS 實戰與所有權鏈機制
Copyright ©
程式碼之家 All Rights Reserved