| 模式 | 原理 | 適用場景 | CPU 開銷 |
|---|---|---|---|
| ROW (列壓縮) | 變長儲存格式 (類似 vardecimal) + 空值/零值最佳化 + 定長型別變長編碼 | OLTP、頻繁更新、字串/定長數值欄位多 | 極低 (僅插入/更新時編碼) |
| PAGE (頁面壓縮) | ROW 壓縮 + **前綴壓縮** (欄位共同前綴) + **字典壓縮** (頁面內重複值替換為 token) | 資料倉庫、唯讀/少更新、高重複值欄位 (維度鍵、狀態碼) | 中等 (頁面分割/重組時建立字典) |
-- 建立表指定壓縮
CREATE TABLE FactSales (Id INT, DateKey INT, Amount MONEY)
WITH (DATA_COMPRESSION = PAGE) ON PartScheme(DateKey);
-- 修改整個表/索引壓縮 (重建)
ALTER TABLE FactSales REBUILD WITH (DATA_COMPRESSION = ROW);
ALTER INDEX IX_FactSales_DateKey ON FactSales REBUILD WITH (DATA_COMPRESSION = PAGE);
-- 分區級差異化壓縮 (SQL 2008 企業版/開發版)
CREATE TABLE PartitionedFact (Id INT, DateKey INT, Data VARCHAR(200))
ON PartScheme(DateKey)
WITH (
DATA_COMPRESSION = ROW ON PARTITIONS(1), -- 最新分區 ROW
DATA_COMPRESSION = PAGE ON PARTITIONS(2 TO 10), -- 歷史分區 PAGE
DATA_COMPRESSION = NONE ON PARTITIONS(11) -- 歸檔分區無壓縮
);
-- 修改單一分區
ALTER TABLE PartitionedFact REBUILD PARTITION = 5 WITH (DATA_COMPRESSION = PAGE);
EXEC sp_estimate_data_compression_savings
@schema_name = 'dbo', @object_name = 'FactSales',
@index_id = NULL, @partition_number = NULL,
@data_compression = 'PAGE';
-- 回傳: size_with_current_compression_setting, size_with_requested_compression_setting, sample_size
sp_estimate_data_compression_savings 評估壓縮率與 CPU 影響。ROW;資料倉庫事實表/維度表用 PAGE。sys.dm_db_index_physical_stats 頁面密度、碎片率。WITH COMPRESSION) 與資料壓縮**疊加效果**,建議同時啟用。資料壓縮僅支援 **Enterprise、Developer、Evaluation** 版本。Standard 版本僅支援 vardecimal (SQL 2005 SP2+)。