行壓縮原理與適用場景
行壓縮將定長類型按實際長度存儲(如 INT 1-4 字節、CHAR(100) 只存實際字符)、移除零值/空值佔用、優化元數據存儲。不改變應用邏輯,適合:
- 含大量定長字符/數值類型的表。
- 讀多寫少的報表、數據倉庫表。
- 歷史歸檔分區、只讀歸檔表。
實測環境與數據準備
-- 非壓縮表
CREATE TABLE NonCompressedTable (
id INT, FName VARCHAR(100), LName VARCHAR(100)
);
DECLARE @n INT = 0;
WHILE @n < 10000
BEGIN
INSERT NonCompressedTable VALUES (1,'Adam','Smith'),(2,'Maria','Carter'),(3,'Walter','Zenegger');
SET @n += 1;
END
-- 共 30,003 行
空間對比結果
| 表類型 | reserved | data | index_size | unused | 壓縮率 |
| 非壓縮表 | 968 KB | 944 KB | 8 KB | 16 KB | 基準 |
| 創建時啟用行壓縮 | 584 KB | 576 KB | 8 KB | 0 KB | 39.7% |
| ALTER REBUILD 啟用行壓縮 | 592 KB | 560 KB | 8 KB | 24 KB | 38.8% |
三種啟用方式
1. 建表時指定
CREATE TABLE CompressedTable (
id INT, FName VARCHAR(100), LName VARCHAR(100)
) WITH (DATA_COMPRESSION = ROW);
2. 修改現有表(離線重建,鎖表)
ALTER TABLE NonCompressedTable2
REBUILD WITH (DATA_COMPRESSION = ROW);
3. 分區表單獨壓縮歷史分區
ALTER TABLE LargePartitionedTable
REBUILD PARTITION = 1 WITH (DATA_COMPRESSION = ROW); -- 僅壓縮分區 1
ALTER TABLE LargePartitionedTable
REBUILD PARTITION = 2 WITH (DATA_COMPRESSION = PAGE); -- 近期分區用頁壓縮
頁壓縮 vs 行壓縮
| 特性 | 行壓縮 | 頁壓縮 |
| 包含關係 | 基礎 | 行壓縮 + 前綴/字典壓縮 |
| 壓縮率 | 中等 | 更高(重複值多時) |
| CPU 開銷 | 低 | 較高 |
| 適用場景 | OLTP、通用 | 數據倉庫、歸檔、高重複列 |
驗證壓縮狀態
SELECT
OBJECT_NAME(object_id) AS TableName,
index_id,
data_compression_desc
FROM sys.partitions
WHERE OBJECT_NAME(object_id) IN ('NonCompressedTable','CompressedTable');
注意事項
REBUILD 需要額外空間(約表大小 1.2 倍),大表在維護窗口執行。
- 壓縮後索引大小通常不變(除非索引鍵值被壓縮)。
sp_estimate_data_compression_savings 可預估壓縮收益,決策前先跑一次。
- 備份壓縮與行/頁壓縮疊加效果更佳:
BACKUP ... WITH COMPRESSION。
- 上一篇文章: SQL Server 數據庫備份還原五大核心操作實戰:完全備份、還原、收縮、轉移、附加脫離
- 下一篇文章: SQL Server 全文檢索方案:Windows 索引服務 + 鏈接服務器實現文件內容搜索
Copyright ©
程式碼之家 All Rights Reserved