查詢瓶頸三大金剛:CPU、記憶體、磁碟 I/O。大資料量下,**I/O 與記憶體壓力通常是主因**。壓縮直接減少資料表/索引物理大小 → 降低 I/O 讀取量、提高緩衝區命中率、縮短備份/還原時間。代價:CPU 解壓縮開銷、寫入路徑複雜度上升。
| 特性 | ROW 壓縮 (行級) | PAGE 壓縮 (頁級) |
|---|---|---|
| 核心技術 | 變長欄位元資料優化 (2 bytes → 3 bits)、數值型別動態長度編碼 (INT 1 只佔 1 byte) | 包含 ROW 壓縮 + 欄位前綴壓縮 + 頁字典壓縮 |
| 欄位前綴壓縮 | 無 | 提取行間共同前綴存儲一次,其餘行存參考符 + 差異尾部。例:URL 共同網域前綴 |
| 頁字典壓縮 | 無 | 在前綴基礎上,將重複值替換為字典索引號。例:狀態碼、類別代碼高頻重複 |
| 適用資料特徵 | 大量變長欄位、數值型別、稀疏資料 | 高重複率字串、低基數欄位、固定格式代碼 |
| 壓縮比典型 | 30%~50% | 50%~80% (視重複度) |
| CPU 開銷 | 低 | 中等 (字典查找/前綴匹配) |
| 支援物件 | 資料表、叢集/非叢集索引、索引檢視、分區 | 同左 |
物件總管 → 資料表/索引右鍵 → **儲存體** → **管理壓縮** → 選擇分區 → 計算 → 選擇 ROW/PAGE/NONE → 執行/產生腳本。
-- 建表時指定
CREATE TABLE FactSales (
SaleId BIGINT IDENTITY,
ProductKey INT,
SaleDate DATE,
Amount MONEY
) WITH (DATA_COMPRESSION = PAGE);
-- 現有表/索引啟用/變更 (離線重建,大表需規劃維護窗口)
ALTER TABLE FactSales REBUILD WITH (DATA_COMPRESSION = PAGE);
ALTER INDEX IX_FactSales_Product ON FactSales REBUILD WITH (DATA_COMPRESSION = ROW);
-- 分區表指定特定分區壓縮
ALTER TABLE FactSales REBUILD PARTITION = 5 WITH (DATA_COMPRESSION = PAGE);
| 場景 | 建議 | 理由 |
|---|---|---|
| OLTP 核心交易表 (高頻寫入) | **無壓縮** 或 **ROW** | 寫入路徑最短、CPU 最省、避免分頁分裂放大 |
| OLAP 事實表/歷史分區 (唯讀/低寫) | **PAGE** | 最高壓縮比、I/O 節省最大、查詢受益最明顯 |
| 非叢集索引 (覆蓋查詢熱點) | **PAGE** | 索引體積縮小直接提升掃描/尋找速度 |
| CPU 已滿載系統 | **謹慎啟用** | 解壓縮 CPU 可能成新瓶頸 |
| 記憶體受限系統 | **積極啟用 PAGE** | 緩衝區容納更多熱頁、命中率躍升 |
資料壓縮是「以 CPU 換 I/O/記憶體」的經典權衡。**ROW 壓縮低風險通用,PAGE 壓縮高收益針對性強**。實施前必測:`sp_estimate_data_compression_savings` 預估壓縮比、CPU 影響、維護窗口。生產部署遵循「冷熱分區差異化、索引同步壓縮、備份疊加壓縮、SHRINK 後重建索引」全鏈路策略,方能最大化收益、最小化風險。