資料庫檔案龐大是儲存成本與備份時間的主要痛點。Red Gate (現屬 Quest) 推出的 SQL Storage Compress (原 HyperBac) 承諾透過 Windows I/O Manager 攔截層,對資料庫檔案進行即時透明壓縮,無需修改應用程式。本文記錄實測部署流程、壓縮率、效能影響與適用場景評估。
運作原理
- 安裝 HyperBac Control Service,註冊檔案系統過濾驅動程式
- 攔截 SQL Server 對
.mdf、.ldf、.ndf 的 Read/Write IRP
- 寫入時:壓縮資料塊 → 寫入磁碟 (實體大小縮減)
- 讀取時:讀取壓縮塊 → 解壓縮 → 回傳給 SQL Server
- 對 SQL Server 引擎完全透明,資料庫線上、離線、備份、還原、DBCC、複寫、AlwaysOn 皆正常運作

支援與限制
| 項目 | 支援狀態 | 備註 |
| 資料檔 (.mdf/.ndf) | ✅ 完整支援 | 含 Filestream 容器 (需測試) |
| 日誌檔 (.ldf) | ✅ 完整支援 | 循環寫入模式壓縮率較低 |
| 備份檔 (.bak) | ❌ 不直接壓縮 | 需搭配 HyperBac SDK 或原生備份壓縮 |
| 單一資料表/索引 | ❌ 檔案層級,不可細粒度控制 | 若需表級壓縮,請用 SQL 原生資料壓縮 (ROW/PAGE) |
| In-Memory OLTP | ❌ 不支援 | 記憶體最佳化表檔案結構不同 |
| AlwaysOn AG | ✅ 支援 | 各複本獨立安裝壓縮服務 |
| 透明資料加密 (TDE) | ⚠️ 需測試 | 加密後資料熵高,壓縮率極低 |
部署步驟 (GUI)
- 下載安裝 SQL Storage Compress (14 天試用)
- 啟動 HyperBac Control Service
- 管理介面 → 「壓縮資料庫」嚮導
- 選擇目標執行個體、資料庫
- 選擇「立即壓縮」或「排程壓縮」
- 等待完成,檢視壓縮報表

實測數據 (測試環境:單機 SSD、SQL 2019、100 萬列寬表)
| 指標 | 未壓縮 | 已壓縮 | 變化 |
| 資料檔大小 | 2.4 GB | 1.2 GB | -50% |
| 插入 100 萬列耗時 | 6 分鐘 (未完成) | 6 分鐘 | 持平/略優 |
| CPU 使用率 (插入期間) | ~15% | ~35% | +20% (壓縮開銷) |
| 磁碟 IOPS (插入期間) | 高 | 降低 ~40% | I/O 為瓶頸時獲益明顯 |
| 查詢 SELECT * (全表掃描) | 12 秒 | 10 秒 | 略快 (讀取資料量減半) |
效能影響分析
- CPU 換 I/O: 壓縮/解壓縮消耗 CPU 週期,換取磁碟頻寬與容量。CPU 閒置、I/O 瓶頸 (HDD、網路儲存、雲端磁碟 IOPS 限制) 環境獲益最大。
- 日誌檔壓縮率低: 循環寫入、高熵特性,預期 10-20% 壓縮率。
- 備份/還原: 讀取壓縮檔 → 解壓 → 寫入備份檔 (未壓縮);還原時寫入壓縮檔。備份時間可能增加 (CPU 瓶頸) 或減少 (I/O 瓶頸)。
- 記憶體: 壓縮緩衝區佔用少量非緩衝集區記憶體,通常 < 100MB。
對比:SQL Server 原生資料壓縮 (ROW/PAGE)
| 維度 | SQL Storage Compress | 原生資料壓縮 |
| 粒度 | 檔案層級 (全庫) | 資料表/索引/分區層級 |
| 透明度 | 100% 透明,無需變更 | 需 ALTER INDEX/REBUILD,鎖定資源 |
| 壓縮率 | 30-60% (視資料型態) | 40-80% (頁壓縮 + 字典/前綴) |
| CPU 開銷 | 讀寫路徑持續 | 僅寫入/重建時,查詢解壓極快 |
| 授權 | 第三方付費 | Enterprise Edition 功能 (2016 SP1+ 全版本) |
適用場景建議
- ✅ 適用: 歷史資料庫、唯讀/低寫入報表庫、開發/測試環境、雲端磁碟按 GB 計費、I/O 受限環境、無法停機重建索引的舊系統
- ❌ 不適用: 高頻 OLTP 核心庫 (CPU 敏感)、已啟用 TDE、In-Memory OLTP、Columnstore 索引為主、需精細控制壓縮策略
SQL Storage Compress 是「不動刀、不停機、立即見效」的空間節省利器,但在 CPU 受限的現代高併發 OLTP 核心系統上,原生資料壓縮 (配合 DATA_COMPRESSION = PAGE) 通常是更優的長期選擇。
- 上一篇文章: SQL Server 叢集架構深度解析:主動/被動 vs 主動/主動、部署成本與高可用策略
- 下一篇文章: MySQL 索引與查詢順序奧秘:為什麼 SELECT * 不按主鍵序?
Copyright ©
程式碼之家 All Rights Reserved