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

SQL Server 2008 行壓縮實測:創建壓縮表、修改現有表啟用壓縮、空間節省效果對比

     編輯:關於SqlServer

行壓縮原理與適用場景

行壓縮將定長類型按實際長度存儲(如 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 行

空間對比結果

表類型reserveddataindex_sizeunused壓縮率
非壓縮表968 KB944 KB8 KB16 KB基準
創建時啟用行壓縮584 KB576 KB8 KB0 KB39.7%
ALTER REBUILD 啟用行壓縮592 KB560 KB8 KB24 KB38.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 行壓縮

驗證壓縮狀態

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。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性行壓縮頁壓縮
包含關係基礎行壓縮 + 前綴/字典壓縮
壓縮率中等更高(重複值多時)
CPU 開銷低較高
適用場景OLTP、通用數據倉庫、歸檔、高重複列