SQL Server 2008 引入革命性的行級/頁級壓縮,底層 Row/Page 格式重寫,存儲引擎層透明實現,無需應用改造。本文深度剖析壓縮原理、空間節省實測、CPU/I/O 權衡、vardecimal 演進、備份壓縮與版本限制。
vardecimal 存儲格式 (表級),針對 decimal/numeric 低精度值壓縮,類似「數字版 VARCHAR」。vardecimal 併入為行壓縮子集,支持所有定長/變長類型,元數據開銷大幅降低。| 類型 | 值範例 | 非壓縮 | 行壓縮 |
|---|---|---|---|
| TINYINT | 1 | 1 字節 | 1 字節 |
| SMALLINT | 1 | 2 字節 | 1 字節 |
| INT | 1 | 4 字節 | 1 字節 |
| BIGINT | 1 | 8 字節 | 1 字節 |
| DECIMAL(18,9) | 1.5 | 9 字節 | ~3 字節 |
CHAR(n) 按實際長度存儲 (去除尾部空格),VARCHAR 無額外收益。在單頁 (8KB) 範圍內識別重複模式:
'Chad', 'Chadwick', 'Chadly', 'Chadster' → 存儲前綴 'Chad',行內存 '', '1wick', '1ly', '1ster'。1='wick', 2='ly', 3='ster' → 行內存 '', '2', '3', '1'。實測效果:典型 OLTP 表 40-60% 空間節省;數據倉庫維度表 60-80%;日志表 30-50%。
| 對象 | 語法 | 說明 |
|---|---|---|
| 堆表 | ALTER TABLE T REBUILD WITH (DATA_COMPRESSION = ROW/PAGE) | 需重建,排他鎖 (ONLINE=ON 可緩解) |
| 聚簇索引 | ALTER INDEX PK_T ON T REBUILD WITH (DATA_COMPRESSION = PAGE) | 葉級即數據頁,效果最顯著 |
| 非聚簇索引 | ALTER INDEX IX_T_C ON T REBUILD WITH (DATA_COMPRESSION = ROW) | 獨立於基表壓縮設置 |
| 分區表 | ALTER INDEX ... REBUILD PARTITION = 5 WITH (DATA_COMPRESSION = PAGE) | 分區級獨立控制,滑動窗口歸檔壓縮 |
| 指標 | 行壓縮 | 頁壓縮 |
|---|---|---|
| CPU 開銷 | +5-15% (解壓/壓縮) | +15-30% (字典編碼/解碼) |
| I/O 讀取 | -40-60% (頁數減少) | -50-80% |
| 緩存命中率 | 顯著提升 (更多熱頁驻留) | 極大提升 |
| 寫入延遲 | 微增 | 明顯增 (頁分裂時重建字典) |
決策建議:CPU 閒置、I/O 瓶頸、讀多寫少 → 頁壓縮;CPU 緊張、寫入頻繁 → 行壓縮;只讀/歸檔數據 → 頁壓縮極致。
BACKUP DATABASE ... WITH COMPRESSION:文件系統級流式壓縮 (類似 GZIP),不依賴行/頁壓縮。sp_estimate_data_compression_savings 預估節省空間與壓縮比。ONLINE=ON, MAXDOP=... 重建啟用壓縮。sys.dm_db_index_physical_stats 碎片與 sys.dm_os_performance_counters CPU/緩存命中率。WITH COMPRESSION,異地傳輸帶寬節省 60%+。SQL Server 2008 壓縮技術將「存儲成本」與「查詢性能」雙贏:I/O 降維打擊 CPU,緩存容量實質擴大。在 CPU 富餘的現代硬件上,頁壓縮已成為大型數據倉庫與歸檔表的標配選項。