行壓縮核心機制
- 變長欄位元資料壓縮:`VARCHAR`/`VARBINARY` 等實際長度儲存從 2 位元組降為 3 位元 (0-8191 位元組)。
- 數值型別動態編碼:`INT` 值 1 僅佔 1 位元組 (原 4);`BIGINT` 小值同理。零/NULL 幾乎不佔空間。
- 不改變頁面結構:仍為標準 8KB 頁,行仍在頁內,僅行內編碼更緊湊。
四大實驗場景與空間對比 (30,003 列測試資料)
| 場景 | 資料空間 | 索引空間 | 備註 |
| 無壓縮堆積表 | 944 KB | 8 KB | 基準 |
| 建表啟用 ROW 壓縮 (`WITH DATA_COMPRESSION=ROW`) | 576 KB | 8 KB | 節省 39% |
| 事後啟用 (`ALTER TABLE ... REBUILD WITH DATA_COMPRESSION=ROW`) | 560 KB | 8 KB | 效果等同建表時 |
| 無壓縮 + 叢集索引 (ID) | 1,096 KB | 64 KB | 叢集索引 = 資料本身 |
| 無壓縮 + 叢集 + 非叢集 (FName) | 1,096 KB | 824 KB | 非叢集索引佔大頭 |
| ROW 壓縮叢集索引 (`WITH DATA_COMPRESSION=ROW`) | 616 KB | 64 KB | 叢集索引壓縮有效 |
| ROW 壓縮非叢集索引 | 616 KB | 496 KB | 非叢集索引壓縮節省 40% |
關鍵 T-SQL 語法
建表指定
CREATE TABLE CompressedTable (
Id INT, FName VARCHAR(100), LName VARCHAR(100)
) WITH (DATA_COMPRESSION = ROW);
現有表/索引啟用 (離線重建)
-- 表 (堆積或叢集)
ALTER TABLE NonCompressedTable REBUILD WITH (DATA_COMPRESSION = ROW);
-- 特定分區
ALTER TABLE PartitionedTable REBUILD PARTITION = 3 WITH (DATA_COMPRESSION = ROW);
-- 非叢集索引
CREATE NONCLUSTERED INDEX IX_FName ON CompressedTable(FName)
WITH (DATA_COMPRESSION = ROW);
-- 現有索引重建壓縮
ALTER INDEX IX_FName ON CompressedTable REBUILD WITH (DATA_COMPRESSION = ROW);
效能影響與適用場景
| 維度 | 影響 | 建議 |
| 讀取 (SELECT) | **正向**:I/O 減少、緩衝區命中率升、掃描速度提升 | 唯讀/多讀少寫表強烈推薦 |
| 寫入 (INSERT/UPDATE/DELETE) | **負向**:CPU 額外編碼/解碼、行長度變動可能導致頁面分裂 | 高頻寫入表謹慎評估、測試 CPU 影響 |
| 索引維護 | 重建/重組時間略增、記錄檔量略增 | 納入維護窗口預算 |
| 備份/還原 | **正向**:備份檔縮小、還原加速 | 配合 `BACKUP COMPRESSION` 雙重效果 |
驗證腳本:查看壓縮狀態與節省空間
-- 物件壓縮狀態
SELECT o.name, p.index_id, p.data_compression_desc, p.row_count,
au.total_pages * 8.0 / 1024 AS SizeMB
FROM sys.partitions p
JOIN sys.objects o ON o.object_id = p.object_id
JOIN sys.allocation_units au ON au.container_id = p.partition_id
WHERE o.type = 'U';
-- 預估壓縮節省 (不實際執行)
EXEC sp_estimate_data_compression_savings 'dbo', 'MyTable', NULL, NULL, 'ROW';
行壓縮 vs 頁壓縮快速選擇
- **ROW**:通用、低風險、適合變長欄位多、數值型別多、寫入頻繁的表。
- **PAGE**:在 ROW 基礎上加前綴/字典壓縮,**適合高重複率字串/代碼、唯讀/歸檔分區、OLAP 事實表**。CPU 成本較高。
總結
行壓縮是 SQL Server 2008+ 以極低代價 (CPU 換 I/O) 獲得 30%~50% 空間節省的「免費午餐」。關鍵點:語法 `DATA_COMPRESSION=ROW`、支援表/索引/分區粒度、需 `REBUILD` 生效、非叢集索引壓縮效益同等顯著、寫入路徑有 CPU 代價需壓測。建立基線、壓測驗證、分區差異化策略,讓壓縮真正成為效能加速器而非負擔。