SQL Server 2008 企業版/開發版支援資料列壓縮,將固定長度型別視為變長儲存、移除零值/空值儲存開銷、優化數值型別位元組長度,在資料列層級壓縮,不改變頁面結構。
CREATE TABLE [Compressed Table]
(id int, FName varchar(100), LName varchar(100))
WITH (DATA_COMPRESSION = ROW);
ALTER TABLE [Existing Table] REBUILD WITH (DATA_COMPRESSION = ROW);
-- 分區表可指定分區
ALTER TABLE [Partitioned Table] REBUILD PARTITION = 2 WITH (DATA_COMPRESSION = ROW);
測試資料:30,003 列,欄位 int, varchar(100), varchar(100),重複值 'Adam','Smith' 等。
| 表格 | 保留空間 | 資料空間 | 索引空間 | 未使用 | 壓縮率 |
|---|---|---|---|---|---|
| 未壓縮 | 968 KB | 944 KB | 8 KB | 16 KB | 基準 |
| 建立時啟用 ROW | 584 KB | 576 KB | 8 KB | 0 KB | 39.7% |
| ALTER REBUILD 啟用 ROW | 592 KB | 560 KB | 8 KB | 24 KB | 38.8% |
資料空間從 944 KB 降至 ~570 KB,節省近 40%。索引空間不變(非叢集索引未壓縮)。
| 層級 | 範圍 | CPU 開銷 | 適用對象 |
|---|---|---|---|
| ROW | 資料列 | 低 | OLTP、頻繁更新、固定長型別多、NULL 多 |
| PAGE | 頁面 (含 ROW + 前綴/字典壓縮) | 中 | 資料倉庫、唯讀、重複值極高 |
| BACKUP | 備份檔案 | 高 (備份時) | 備份傳輸/儲存節省 |
注意:啟用壓縮後,INSERT/UPDATE/DELETE 需額外 CPU 進行壓縮/解壓縮,但 I/O 減少通常可抵銷。建議先在測試環境基準測試。
SELECT OBJECT_NAME(object_id) AS TableName, index_id, data_compression_desc
FROM sys.partitions
WHERE data_compression_desc != 'NONE';
資料列壓縮是 SQL Server 2008 企業版極具性價比的功能:無需修改應用程式、透過 ALTER TABLE ... REBUILD 即時啟用、典型節省 30%~50% 資料空間、減少 I/O 與記憶體壓力。配合分區表逐分區啟用,可控制重建影響範圍。資料倉庫場景建議直接上頁面壓縮獲取更高壓縮比。