Skip to content

DM 数据压缩

压缩优势

优势描述
节省存储空间减少数据占用的磁盘空间,降低存储成本
提高 I/O 性能减少数据传输量,降低 I/O 开销,提高查询速度
降低内存占用压缩后的数据在内存中占用更少空间,提高内存利用率
加速备份恢复减少备份数据量,加速备份和恢复过程
降低网络传输成本在分布式环境中,减少数据传输量,降低网络成本

压缩类型

DM 数据库支持多种压缩类型,适应不同的应用场景:

压缩类型描述适用场景
表压缩压缩整个表的数据静态数据、历史数据
索引压缩压缩索引数据大型索引、频繁查询的索引
分区压缩压缩分区表的特定分区分区表、按时间归档的数据
大字段压缩压缩 CLOB、BLOB 等大字段数据包含大量文本或二进制数据的表

压缩算法

DM 数据库支持多种压缩算法,平衡压缩率和压缩/解压缩性能:

算法压缩率压缩速度解压缩速度适用场景
LZ4对性能要求高的场景
ZLIB对压缩率要求高的场景
ZSTD平衡压缩率和性能的场景
RLE极快极快重复数据较多的场景

表压缩

表压缩是 DM 数据库最常用的压缩方式,能够压缩整个表的数据,包括数据行和LOB数据。

表压缩类型

DM 数据库支持两种表压缩类型:

压缩类型描述适用场景
直接压缩创建表时直接启用压缩新创建的表
在线压缩对已有表进行在线压缩已存在的表

压缩级别

DM 数据库提供了多个压缩级别,允许用户根据需求平衡压缩率和性能:

压缩级别描述压缩率性能影响
NOCOMPRESS不压缩
LOW低压缩级别最小
MEDIUM中等压缩级别中等
HIGH高压缩级别较大
EXTREME极高压缩级别极高最大

直接压缩

在创建表时直接启用压缩,适合新表或批量加载数据的场景。

配置示例

sql
-- 创建使用默认压缩级别的表
CREATE TABLE sales_compressed (
    id INT PRIMARY KEY,
    product_id INT,
    sales_date DATE,
    amount DECIMAL(10,2),
    description VARCHAR(100)
) COMPRESS;

-- 指定压缩算法和级别
CREATE TABLE sales_advanced_compressed (
    id INT PRIMARY KEY,
    product_id INT,
    sales_date DATE,
    amount DECIMAL(10,2),
    description VARCHAR(100)
) COMPRESS USING ZSTD LEVEL HIGH;

-- 只压缩特定列
CREATE TABLE sales_column_compressed (
    id INT PRIMARY KEY,
    product_id INT,
    sales_date DATE,
    amount DECIMAL(10,2),
    description VARCHAR(1000) COMPRESS USING LZ4
);

在线压缩

对已存在的表进行在线压缩,适合对现有数据进行压缩优化。

配置示例

sql
-- 对现有表进行压缩
ALTER TABLE sales COMPRESS;

-- 指定压缩算法和级别
ALTER TABLE sales COMPRESS USING ZSTD LEVEL MEDIUM;

-- 压缩表的特定分区
ALTER TABLE sales_partitioned MODIFY PARTITION p2023 COMPRESS USING ZLIB LEVEL HIGH;

-- 解压表
ALTER TABLE sales NOCOMPRESS;

压缩表的维护

压缩表的 DML 操作

压缩表支持所有 DML 操作,包括插入、更新、删除和查询:

sql
-- 插入数据到压缩表
INSERT INTO sales_compressed VALUES (1, 1001, '2023-01-01', 100.50, 'Sales record 1');

-- 更新压缩表数据
UPDATE sales_compressed SET amount = 150.75 WHERE id = 1;

-- 删除压缩表数据
DELETE FROM sales_compressed WHERE id = 1;

-- 查询压缩表
SELECT * FROM sales_compressed WHERE sales_date BETWEEN '2023-01-01' AND '2023-12-31';

压缩表的重建

当压缩表的数据分布发生变化时,可以重建表以优化压缩效果:

sql
-- 重建压缩表
ALTER TABLE sales_compressed REBUILD;

-- 在线重建压缩表
ALTER TABLE sales_compressed REBUILD ONLINE;

索引压缩

DM 数据库支持索引压缩,能够减少索引占用的存储空间,提高索引访问性能。

索引压缩类型

索引类型压缩支持适用场景
B树索引支持普通索引、唯一索引
位图索引支持低基数列的索引
复合索引支持多列索引
分区索引支持分区表的索引

索引压缩配置

创建压缩索引

sql
-- 创建压缩索引
CREATE INDEX idx_sales_date ON sales(sales_date) COMPRESS;

-- 指定压缩算法
CREATE INDEX idx_sales_product ON sales(product_id) COMPRESS USING ZSTD;

-- 对现有索引进行压缩
ALTER INDEX idx_sales_amount COMPRESS USING LZ4;

-- 解压索引
ALTER INDEX idx_sales_date NOCOMPRESS;

压缩索引的维护

sql
-- 重建压缩索引
ALTER INDEX idx_sales_date REBUILD;

-- 收集压缩索引的统计信息
ANALYZE INDEX idx_sales_date COMPUTE STATISTICS;

-- 查看压缩索引信息
SELECT INDEX_NAME, COMPRESSION, COMPRESSION_TYPE
FROM DBA_INDEXES
WHERE TABLE_NAME = 'SALES';

分区压缩

DM 数据库支持分区压缩,可以对分区表的特定分区进行压缩,实现更细粒度的压缩管理。

分区压缩优势

  • 灵活的压缩策略:可以根据分区的使用情况,为不同分区设置不同的压缩策略
  • 高效的归档管理:对历史分区进行高压缩,对活跃分区进行低压缩或不压缩
  • 优化查询性能:查询时只解压需要访问的分区
  • 降低维护成本:可以单独维护某个分区的压缩状态

分区压缩配置

创建压缩分区表

sql
-- 创建分区表时指定压缩
CREATE TABLE sales_partitioned (
    id INT PRIMARY KEY,
    product_id INT,
    sales_date DATE,
    amount DECIMAL(10,2)
)
PARTITION BY RANGE (sales_date) (
    PARTITION p2022 VALUES LESS THAN ('2023-01-01') COMPRESS USING ZSTD LEVEL HIGH,
    PARTITION p2023 VALUES LESS THAN ('2024-01-01') COMPRESS USING ZSTD LEVEL MEDIUM,
    PARTITION p2024 VALUES LESS THAN ('2025-01-01')
);

-- 修改分区压缩属性
ALTER TABLE sales_partitioned MODIFY PARTITION p2024 COMPRESS USING ZSTD LEVEL LOW;

-- 解压特定分区
ALTER TABLE sales_partitioned MODIFY PARTITION p2023 NOCOMPRESS;

分区压缩维护

sql
-- 重建特定分区
ALTER TABLE sales_partitioned REBUILD PARTITION p2022;

-- 交换压缩分区
CREATE TABLE sales_2021 LIKE sales_partitioned;
-- 加载数据到 sales_2021
ALTER TABLE sales_partitioned EXCHANGE PARTITION p2021 WITH TABLE sales_2021 COMPRESS;

大字段压缩

DM 数据库支持对大字段(CLOB、BLOB)进行压缩,适合处理包含大量文本或二进制数据的场景。

大字段压缩优势

  • 减少大字段占用的存储空间
  • 提高大字段的 I/O 性能
  • 降低网络传输成本
  • 加速大字段的备份和恢复

大字段压缩配置

sql
-- 创建包含压缩大字段的表
CREATE TABLE document (
    id INT PRIMARY KEY,
    title VARCHAR(100),
    content CLOB COMPRESS USING ZLIB LEVEL HIGH,
    attachment BLOB COMPRESS USING ZSTD
);

-- 修改现有大字段为压缩
ALTER TABLE document MODIFY content COMPRESS USING LZ4;
ALTER TABLE document MODIFY attachment COMPRESS USING ZSTD LEVEL MEDIUM;

-- 取消大字段压缩
ALTER TABLE document MODIFY content NOCOMPRESS;

压缩算法

DM 数据库支持多种压缩算法,每种算法有不同的压缩率和性能特点,用户可以根据需求选择合适的算法。

算法比较

算法压缩率压缩速度解压缩速度CPU 开销适用场景
LZ4极快极快对性能要求高的场景
ZSTD平衡压缩率和性能的场景
ZLIB对压缩率要求高的场景
RLE极快极快极低重复数据较多的场景
LZO实时数据压缩场景

算法选择建议

场景推荐算法推荐压缩级别
实时交易系统LZ4LOW/MEDIUM
数据仓库ZSTD/ZLIBHIGH/EXTREME
历史数据归档ZLIBEXTREME
大字段存储ZSTDMEDIUM/HIGH
高频查询表LZ4LOW
低频访问表ZLIBHIGH

压缩管理

DM 数据库提供了丰富的压缩管理功能,方便管理员监控和管理压缩对象。

压缩监控

查看压缩信息

sql
-- 查看表压缩信息
SELECT TABLE_NAME, COMPRESSION, COMPRESSION_TYPE
FROM DBA_TABLES
WHERE COMPRESSION != 'NOCOMPRESS';

-- 查看索引压缩信息
SELECT INDEX_NAME, COMPRESSION, COMPRESSION_TYPE
FROM DBA_INDEXES
WHERE COMPRESSION != 'NOCOMPRESS';

-- 查看分区压缩信息
SELECT TABLE_NAME, PARTITION_NAME, COMPRESSION
FROM DBA_TAB_PARTITIONS
WHERE COMPRESSION != 'NOCOMPRESS';

查看压缩效果

sql
-- 查看表的压缩率
SELECT TABLE_NAME, 
       BYTES AS UNCOMPRESSED_SIZE,
       COMPRESSED_BYTES AS COMPRESSED_SIZE,
       ROUND((1 - COMPRESSED_BYTES/BYTES)*100, 2) AS COMPRESSION_RATIO
FROM DBA_TABLES
WHERE COMPRESSION != 'NOCOMPRESS';

-- 查看索引的压缩率
SELECT INDEX_NAME, 
       BYTES AS UNCOMPRESSED_SIZE,
       COMPRESSED_BYTES AS COMPRESSED_SIZE,
       ROUND((1 - COMPRESSED_BYTES/BYTES)*100, 2) AS COMPRESSION_RATIO
FROM DBA_INDEXES
WHERE COMPRESSION != 'NOCOMPRESS';

压缩维护

重建压缩对象

sql
-- 重建压缩表
ALTER TABLE sales_compressed REBUILD;

-- 在线重建压缩表
ALTER TABLE sales_compressed REBUILD ONLINE;

-- 重建压缩索引
ALTER INDEX idx_sales_date REBUILD;

-- 重建压缩分区
ALTER TABLE sales_partitioned REBUILD PARTITION p2023;

收集压缩对象的统计信息

sql
-- 收集压缩表的统计信息
ANALYZE TABLE sales_compressed COMPUTE STATISTICS;

-- 收集压缩索引的统计信息
ANALYZE INDEX idx_sales_date COMPUTE STATISTICS;

-- 收集压缩分区的统计信息
ANALYZE TABLE sales_partitioned PARTITION p2023 COMPUTE STATISTICS;

压缩与性能

压缩对性能的影响

操作类型性能影响说明
查询操作正面影响减少 I/O 开销,提高查询速度
插入操作轻微负面影响需要进行压缩,增加 CPU 开销
更新操作轻微负面影响需要解压和重新压缩,增加 CPU 开销
删除操作无明显影响与未压缩表类似
索引访问正面影响减少索引 I/O,提高索引访问速度
备份恢复正面影响减少备份数据量,加速备份和恢复

性能优化建议

  1. 选择合适的压缩算法:根据应用场景选择合适的压缩算法,平衡压缩率和性能
  2. 采用分层压缩策略:对不同类型的数据采用不同的压缩策略
  3. 定期维护压缩对象:定期重建压缩对象,保持良好的压缩率
  4. 收集准确的统计信息:确保优化器获得准确的压缩率信息,生成最优执行计划
  5. 监控压缩效果:定期监控压缩率和性能变化,及时调整压缩策略
  6. 考虑硬件特性:在 CPU 资源充足的环境中,可以使用更高的压缩级别

压缩最佳实践

1. 压缩策略设计

  • 数据生命周期管理:根据数据的使用频率和生命周期,设计不同的压缩策略

    • 活跃数据:低压缩级别或不压缩
    • 历史数据:高压缩级别
    • 归档数据:极高压缩级别
  • 分层压缩

    • 表级别:对整个表进行压缩
    • 分区级别:对不同分区设置不同的压缩策略
    • 列级别:只对特定列进行压缩

2. 压缩算法选择

数据类型推荐算法原因
文本数据ZSTD/ZLIB文本数据压缩率高
数值数据LZ4/RLE数值数据压缩速度快
图片/音频ZSTD平衡压缩率和性能
日志数据LZ4日志数据写入频繁,需要高压缩速度
历史数据ZLIB历史数据访问频率低,优先考虑压缩率

3. 压缩实施步骤

  1. 评估压缩潜力:分析数据特征,评估压缩潜力
  2. 选择压缩策略:根据数据特点和应用需求,选择合适的压缩策略
  3. 测试压缩效果:在测试环境中测试压缩效果和性能影响
  4. 实施压缩:在生产环境中实施压缩
  5. 监控和调整:监控压缩效果和性能,根据需要调整压缩策略

4. 压缩注意事项

  • 避免过度压缩:过高的压缩级别可能导致 CPU 开销过大,影响性能
  • 考虑硬件资源:在 CPU 资源有限的环境中,应选择低压缩级别或快速压缩算法
  • 定期维护:定期重建压缩对象,保持良好的压缩率
  • 备份压缩数据:确保备份压缩数据的完整性和可恢复性
  • 考虑应用兼容性:确保应用程序能够正确处理压缩数据

版本差异

DM 7 vs DM 8 压缩功能差异

差异点DM 7DM 8
压缩算法支持基本压缩算法支持多种压缩算法(LZ4、ZSTD、ZLIB、RLE)
压缩级别基本压缩级别多级压缩级别(LOW、MEDIUM、HIGH、EXTREME)
压缩类型表压缩、索引压缩表压缩、索引压缩、分区压缩、大字段压缩
压缩粒度表级压缩表级、分区级、列级压缩
在线压缩支持有限完善的在线压缩支持
压缩管理基本管理功能丰富的压缩监控和管理功能

DM 8.1 新特性

  • 新增 ZSTD 压缩算法,提供更高的压缩率和更快的压缩速度
  • 增强了分区压缩功能,支持更细粒度的压缩管理
  • 优化了压缩性能,降低了压缩/解压缩的 CPU 开销
  • 增加了压缩监控视图,方便管理员监控压缩效果
  • 支持大字段压缩,优化了大字段的存储和访问

常见问题(FAQ)

Q1: 如何选择合适的压缩算法?

A1: 选择压缩算法时应考虑以下因素:

  1. 压缩率要求:对存储空间要求高时,选择高压缩率算法(如 ZLIB)
  2. 性能要求:对性能要求高时,选择快速压缩算法(如 LZ4)
  3. 数据类型:根据数据类型选择合适的算法,如文本数据适合 ZSTD/ZLIB,数值数据适合 LZ4/RLE
  4. 硬件资源:CPU 资源充足时可使用高压缩级别,CPU 资源有限时使用低压缩级别

Q2: 压缩会影响数据库性能吗?

A2: 压缩对性能的影响取决于多种因素:

  • 查询操作:通常会提高性能,因为减少了 I/O 开销
  • 写入操作:会增加一定的 CPU 开销,因为需要进行压缩
  • 压缩级别:压缩级别越高,CPU 开销越大
  • 硬件资源:CPU 资源充足时,压缩对性能的影响较小

Q3: 如何查看表的压缩率?

A3: 可以通过以下 SQL 查询表的压缩率:

sql
SELECT TABLE_NAME, 
       BYTES AS UNCOMPRESSED_SIZE,
       COMPRESSED_BYTES AS COMPRESSED_SIZE,
       ROUND((1 - COMPRESSED_BYTES/BYTES)*100, 2) AS COMPRESSION_RATIO
FROM DBA_TABLES
WHERE TABLE_NAME = 'SALES';

Q4: 如何对现有表进行压缩?

A4: 可以使用 ALTER TABLE 命令对现有表进行压缩:

sql
-- 对现有表进行压缩
ALTER TABLE sales COMPRESS;

-- 指定压缩算法和级别
ALTER TABLE sales COMPRESS USING ZSTD LEVEL MEDIUM;

Q5: 压缩表支持所有 DML 操作吗?

A5: 是的,压缩表支持所有 DML 操作,包括 INSERT、UPDATE、DELETE 和 SELECT。压缩对应用程序透明,无需修改应用代码。

Q6: 如何取消表的压缩?

A6: 可以使用 ALTER TABLE 命令取消表的压缩:

sql
ALTER TABLE sales NOCOMPRESS;

Q7: 分区表可以只压缩特定分区吗?

A7: 是的,DM 数据库支持分区压缩,可以对分区表的特定分区进行压缩:

sql
-- 对特定分区进行压缩
ALTER TABLE sales_partitioned MODIFY PARTITION p2023 COMPRESS USING ZSTD;

-- 对特定分区取消压缩
ALTER TABLE sales_partitioned MODIFY PARTITION p2023 NOCOMPRESS;

Q8: 压缩索引会影响索引性能吗?

A8: 压缩索引通常会提高索引性能,因为:

  1. 减少了索引占用的存储空间
  2. 减少了索引 I/O 开销
  3. 提高了索引缓存命中率
  4. 加速了索引扫描操作

Q9: 如何监控压缩效果?

A9: 可以通过以下方式监控压缩效果:

  1. 查询 DBA_TABLES、DBA_INDEXES 等视图查看压缩信息
  2. 监控压缩率变化,确保压缩效果符合预期
  3. 监控数据库性能变化,确保压缩不会对性能造成负面影响
  4. 定期收集压缩对象的统计信息,确保优化器获得准确的压缩率信息

Q10: 压缩数据的备份和恢复有什么注意事项?

A10: 压缩数据的备份和恢复需要注意以下事项:

  1. 确保备份工具支持压缩数据的备份和恢复
  2. 压缩数据的备份通常会更快,因为减少了备份数据量
  3. 恢复压缩数据时,需要确保目标数据库支持相同的压缩算法
  4. 建议定期测试压缩数据的恢复,确保备份的完整性和可恢复性