首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 2008 行壓縮深度解析:建立、啟用、索引壓縮與空間驗證

     編輯:關於SqlServer

行壓縮核心機制

  • 變長欄位元資料壓縮:`VARCHAR`/`VARBINARY` 等實際長度儲存從 2 位元組降為 3 位元 (0-8191 位元組)。
  • 數值型別動態編碼:`INT` 值 1 僅佔 1 位元組 (原 4);`BIGINT` 小值同理。零/NULL 幾乎不佔空間。
  • 不改變頁面結構:仍為標準 8KB 頁,行仍在頁內,僅行內編碼更緊湊。

四大實驗場景與空間對比 (30,003 列測試資料)

場景資料空間索引空間備註
無壓縮堆積表944 KB8 KB基準
建表啟用 ROW 壓縮 (`WITH DATA_COMPRESSION=ROW`)576 KB8 KB節省 39%
事後啟用 (`ALTER TABLE ... REBUILD WITH DATA_COMPRESSION=ROW`)560 KB8 KB效果等同建表時
無壓縮 + 叢集索引 (ID)1,096 KB64 KB叢集索引 = 資料本身
無壓縮 + 叢集 + 非叢集 (FName)1,096 KB824 KB非叢集索引佔大頭
ROW 壓縮叢集索引 (`WITH DATA_COMPRESSION=ROW`)616 KB64 KB叢集索引壓縮有效
ROW 壓縮非叢集索引616 KB496 KB非叢集索引壓縮節省 40%

關鍵 T-SQL 語法

建表指定


CREATE TABLE CompressedTable (
    Id INT, FName VARCHAR(100), LName VARCHAR(100)
) WITH (DATA_COMPRESSION = ROW);

現有表/索引啟用 (離線重建)


-- 表 (堆積或叢集)
ALTER TABLE NonCompressedTable REBUILD WITH (DATA_COMPRESSION = ROW);

-- 特定分區
ALTER TABLE PartitionedTable REBUILD PARTITION = 3 WITH (DATA_COMPRESSION = ROW);

-- 非叢集索引
CREATE NONCLUSTERED INDEX IX_FName ON CompressedTable(FName) 
WITH (DATA_COMPRESSION = ROW);

-- 現有索引重建壓縮
ALTER INDEX IX_FName ON CompressedTable REBUILD WITH (DATA_COMPRESSION = ROW);

效能影響與適用場景

維度影響建議
讀取 (SELECT)**正向**:I/O 減少、緩衝區命中率升、掃描速度提升唯讀/多讀少寫表強烈推薦
寫入 (INSERT/UPDATE/DELETE)**負向**:CPU 額外編碼/解碼、行長度變動可能導致頁面分裂高頻寫入表謹慎評估、測試 CPU 影響
索引維護重建/重組時間略增、記錄檔量略增納入維護窗口預算
備份/還原**正向**:備份檔縮小、還原加速配合 `BACKUP COMPRESSION` 雙重效果

驗證腳本:查看壓縮狀態與節省空間


-- 物件壓縮狀態
SELECT o.name, p.index_id, p.data_compression_desc, p.row_count, 
       au.total_pages * 8.0 / 1024 AS SizeMB
FROM sys.partitions p
JOIN sys.objects o ON o.object_id = p.object_id
JOIN sys.allocation_units au ON au.container_id = p.partition_id
WHERE o.type = 'U';

-- 預估壓縮節省 (不實際執行)
EXEC sp_estimate_data_compression_savings 'dbo', 'MyTable', NULL, NULL, 'ROW';

行壓縮 vs 頁壓縮快速選擇

  • **ROW**:通用、低風險、適合變長欄位多、數值型別多、寫入頻繁的表。
  • **PAGE**:在 ROW 基礎上加前綴/字典壓縮,**適合高重複率字串/代碼、唯讀/歸檔分區、OLAP 事實表**。CPU 成本較高。

總結

行壓縮是 SQL Server 2008+ 以極低代價 (CPU 換 I/O) 獲得 30%~50% 空間節省的「免費午餐」。關鍵點:語法 `DATA_COMPRESSION=ROW`、支援表/索引/分區粒度、需 `REBUILD` 生效、非叢集索引壓縮效益同等顯著、寫入路徑有 CPU 代價需壓測。建立基線、壓測驗證、分區差異化策略,讓壓縮真正成為效能加速器而非負擔。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved