雖然儲存成本下降,但資料庫體積直接影響:
SQL Server 2005 SP2 引入 `vardecimal` 僅針對 decimal/numeric。SQL Server 2008 全面擴展至所有定長型別,並提供行壓縮與頁壓縮兩種模式(Enterprise/Developer 版專屬)。
| 場景 | 建議 | 理由 |
|---|---|---|
| OLTP 高頻寫入表 | 行壓縮 | 低 CPU、無字典維護、鎖衝突少 |
| 資料倉庫大型事實表 | 頁壓縮 | 重複率高、查詢為主、I/O 節省最大 |
| 混合載入/查詢分區表 | 分區級混合 | 熱分區行壓縮/關閉,冷分區頁壓縮 |
| 含 XML/BLOB/MAX 欄位 | 不可壓縮 |
-- 行壓縮
CREATE TABLE Alpha (col1 INT, col2 CHAR(1000))
WITH (DATA_COMPRESSION = ROW);
-- 頁壓縮(分區表指定分區)
CREATE TABLE Alpha_Partition (col1 INT, col2 CHAR(1000))
ON PartitionScheme(col1)
WITH (DATA_COMPRESSION = PAGE ON PARTITIONS(1 TO 3));
-- 整張表改為頁壓縮
ALTER TABLE Alpha REBUILD WITH (DATA_COMPRESSION = PAGE);
-- 分區表僅修改特定分區
ALTER TABLE Alpha REBUILD PARTITION = 2 WITH (DATA_COMPRESSION = PAGE);
-- 索引壓縮
CREATE INDEX IX_Alpha_Col1 ON Alpha(Col1) WITH (DATA_COMPRESSION = ROW);
ALTER INDEX IX_Alpha_Col1 ON Alpha REBUILD WITH (DATA_COMPRESSION = ROW);
CREATE TABLE PartitionedTable (col1 INT, col2 VARCHAR(200))
ON PS1(col1)
WITH (
DATA_COMPRESSION = ROW ON PARTITIONS(1), -- 熱分區:行壓縮
DATA_COMPRESSION = PAGE ON PARTITIONS(2 TO 4) -- 冷分區:頁壓縮
);
EXEC sp_estimate_data_compression_savings
@schema_name = 'dbo',
@object_name = 'BigTable',
@index_id = 1, -- 0=堆疊, 1=叢集索引, >1=非叢集索引
@data_compression = 'PAGE'; -- 或 'ROW'
輸出含 `size_with_current_compression_setting`、`size_with_requested_compression_setting`、`sample_size`,可量化空間節省與預估 CPU 影響。
SQL Server 2008 資料壓縮以「以 CPU 換 I/O」為核心權衡。行壓縮通用性強、風險低;頁壓縮針對高重複資料效果極致。善用分區級混合策略,可在資料倉庫熱/冷資料間取得最佳平衡。Enterprise 版專屬功能,決策前確認授權。