Skip to content

GaussDB 压缩配置

压缩类型

列存储压缩

  • 针对列存储表的压缩技术
  • 利用列数据的相似性进行高效压缩
  • 支持多种压缩算法,如字典压缩、行程长度编码、差值编码等
  • 适合分析型 workload,能显著提高查询性能和降低存储成本

行存储压缩

  • 针对行存储表的压缩技术
  • 支持页级压缩和行级压缩
  • 适合事务型 workload,在保证性能的同时降低存储成本
  • 压缩率相对列存储较低,但对事务性能影响较小

临时表压缩

  • 针对临时表的压缩配置
  • 减少临时表的存储空间占用
  • 提高临时表的处理性能
  • 适合复杂查询和大规模数据处理场景

备份压缩

  • 针对备份数据的压缩配置
  • 减少备份数据的存储空间和备份时间
  • 支持不同的压缩级别
  • 适合大规模数据备份场景

压缩配置方法

列存储压缩配置

创建表时配置

sql
-- 创建列存储压缩表
CREATE TABLE sales_column (
    id SERIAL PRIMARY KEY,
    sale_date DATE,
    product_id INT,
    amount DECIMAL(10,2)
) WITH (
    ORIENTATION = COLUMN,
    COMPRESSION = HIGH
);

修改现有表

sql
-- 修改现有列存储表的压缩级别
ALTER TABLE sales_column SET (
    COMPRESSION = MIDDLE
);

压缩级别说明

  • HIGH:最高压缩率,适合冷数据存储
  • MIDDLE:中等压缩率,平衡压缩率和性能
  • LOW:低压缩率,适合热数据存储
  • NO:不压缩,适合频繁更新的数据

行存储压缩配置

创建表时配置

sql
-- 创建行存储压缩表
CREATE TABLE users_row (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100),
    created_at TIMESTAMP
) WITH (
    ORIENTATION = ROW,
    COMPRESSION = ROW
);

修改现有表

sql
-- 修改现有行存储表的压缩配置
ALTER TABLE users_row SET (
    COMPRESSION = PAGE
);

压缩类型说明

  • ROW:行级压缩,对每一行数据进行压缩
  • PAGE:页级压缩,对每一页数据进行压缩
  • NO:不压缩

临时表压缩配置

sql
-- 设置临时表压缩级别
SET temp_table_compression = 'MIDDLE';

-- 创建临时表时指定压缩
CREATE TEMPORARY TABLE temp_sales (
    id INT,
    amount DECIMAL(10,2)
) WITH (
    COMPRESSION = HIGH
);

备份压缩配置

sql
-- 使用 gs_dump 进行压缩备份
gs_dump -d mydb -f mydb_backup.sql.gz -Z 6

-- 配置自动备份压缩
ALTER SYSTEM SET backup_compression = on;
ALTER SYSTEM SET backup_compression_level = 6;

压缩性能影响

存储成本

  • 压缩可以显著降低存储空间占用,通常可以达到 2-10 倍的压缩率
  • 列存储压缩率通常高于行存储压缩率
  • 高压缩级别可以获得更高的压缩率,但会增加 CPU 开销

查询性能

列存储压缩

  • 对于分析型查询,压缩通常可以提高查询性能
  • 减少 I/O 开销,加速数据加载
  • 压缩数据在内存中可以存储更多数据,提高缓存命中率
  • 但解压缩过程会增加 CPU 开销

行存储压缩

  • 对于事务型查询,压缩可能会略微降低写性能
  • 但可以提高读性能,尤其是对于 I/O 密集型 workload
  • 压缩可以减少缓冲池的使用,提高系统的并发处理能力

写入性能

  • 压缩会增加数据写入时的 CPU 开销
  • 高压缩级别对写入性能的影响更大
  • 行存储压缩对写入性能的影响通常小于列存储压缩
  • 对于频繁更新的表,建议使用低压缩级别或不压缩

压缩最佳实践

压缩级别选择

热数据

  • 访问频率高,更新频繁
  • 建议使用 LOW 压缩级别或 NO 压缩
  • 优先保证性能,其次考虑存储成本

温数据

  • 访问频率中等,更新不频繁
  • 建议使用 MIDDLE 压缩级别
  • 平衡压缩率和性能

冷数据

  • 访问频率低,几乎不更新
  • 建议使用 HIGH 压缩级别
  • 优先考虑存储成本,其次保证性能

表类型与压缩选择

事务型表

  • 建议使用行存储,配合 ROW 或 PAGE 压缩
  • 压缩级别建议选择 LOW 或 MIDDLE
  • 适合 OLTP 场景

分析型表

  • 建议使用列存储,配合适当的压缩级别
  • 压缩级别建议选择 MIDDLE 或 HIGH
  • 适合 OLAP 场景

大表

  • 建议使用压缩,尤其是列存储压缩
  • 可以显著降低存储成本和提高查询性能
  • 考虑对大表进行分区,不同分区使用不同的压缩级别

压缩配置注意事项

压缩算法选择

  • GaussDB 会根据数据类型自动选择合适的压缩算法
  • 一般不需要手动指定压缩算法
  • 对于特殊数据类型,可以考虑调整压缩配置

压缩与索引

  • 压缩会影响索引的存储和访问
  • 建议在压缩表上创建合适的索引,提高查询性能
  • 索引也会被压缩,减少存储空间占用

压缩与分区

  • 可以对不同分区设置不同的压缩级别
  • 例如,历史分区使用 HIGH 压缩,当前分区使用 LOW 压缩
  • 提高存储效率,同时保证当前数据的查询性能

压缩监控与管理

压缩率监控

sql
-- 查看表的压缩率
SELECT
    relname AS table_name,
    pg_size_pretty(pg_total_relation_size(oid)) AS total_size,
    pg_size_pretty(pg_indexes_size(oid)) AS index_size,
    pg_size_pretty(pg_total_relation_size(oid) - pg_indexes_size(oid)) AS table_size,
    pg_size_pretty(pg_total_relation_size(oid) - pg_indexes_size(oid) - pg_table_size(oid)) AS toast_size
FROM pg_class
WHERE relname = 'sales_column';

压缩配置查看

sql
-- 查看表的压缩配置
SELECT
    relname AS table_name,
    reloptions
FROM pg_class
WHERE relname = 'sales_column';

压缩表重建

sql
-- 重建压缩表,优化压缩率
VACUUM FULL sales_column;

-- 或者使用 REINDEX
REINDEX TABLE sales_column;

压缩表迁移

sql
-- 创建压缩表并迁移数据
CREATE TABLE new_table (
    LIKE old_table INCLUDING ALL
) WITH (
    COMPRESSION = HIGH
);

INSERT INTO new_table SELECT * FROM old_table;

-- 替换原表
ALTER TABLE old_table RENAME TO old_table_backup;
ALTER TABLE new_table RENAME TO old_table;

常见问题(FAQ)

Q1: 如何选择合适的压缩级别?

A1: 选择压缩级别时应考虑以下因素:

  1. 数据的访问频率:热数据使用低压缩级别,冷数据使用高压缩级别
  2. 数据的更新频率:频繁更新的数据使用低压缩级别或不压缩
  3. 数据类型:不同数据类型的压缩效果不同
  4. 业务需求:平衡存储成本和性能需求
  5. 硬件配置:CPU 资源充足时可以考虑更高的压缩级别

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

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

  1. 对于读密集型 workload,压缩通常可以提高性能,因为减少了 I/O 开销
  2. 对于写密集型 workload,压缩可能会略微降低性能,因为增加了 CPU 开销
  3. 列存储压缩对分析查询性能提升明显,对事务性能影响较小
  4. 行存储压缩对事务性能影响较小,适合 OLTP 场景

Q3: 如何评估压缩效果?

A3: 评估压缩效果的方法:

  1. 比较压缩前后的表大小,计算压缩率
  2. 测试压缩前后的查询性能
  3. 监控压缩表的 CPU 和 I/O 使用情况
  4. 分析压缩对应用程序响应时间的影响

Q4: 可以对现有表启用压缩吗?

A4: 可以对现有表启用压缩:

  1. 使用 ALTER TABLE 命令修改表的压缩配置
  2. 但修改压缩配置后,只有新插入的数据会被压缩
  3. 对于已存在的数据,需要使用 VACUUM FULL 或重建表的方式进行压缩

Q5: 压缩表支持所有数据类型吗?

A5: GaussDB 压缩表支持大多数数据类型,但有一些限制:

  1. 支持常见的数据类型,如整数、浮点型、字符型、日期时间型等
  2. 对于大对象(如 TEXT、BYTEA),会存储在 TOAST 表中,也支持压缩
  3. 建议测试特定数据类型的压缩效果

Q6: 压缩会影响备份和恢复吗?

A6: 压缩对备份和恢复的影响:

  1. 压缩表的备份时间通常会缩短,因为需要备份的数据量减少
  2. 备份文件的大小会减小,节省存储空间
  3. 恢复时间可能会略微增加,因为需要解压缩数据
  4. 可以结合备份压缩,进一步提高备份效率

Q7: 如何监控压缩表的性能?

A7: 监控压缩表性能的方法:

  1. 使用 pg_stat_user_tables 视图监控表的访问情况
  2. 使用 EXPLAIN ANALYZE 分析查询执行计划和性能
  3. 监控数据库的 CPU、I/O 和内存使用情况
  4. 比较压缩前后的性能指标

Q8: 压缩表支持索引吗?

A8: 压缩表完全支持索引:

  1. 可以在压缩表上创建各种类型的索引
  2. 索引也会被压缩,减少存储空间占用
  3. 压缩表上的索引查询性能通常较好,因为数据量减少
  4. 建议根据查询模式创建合适的索引

Q9: 如何优化压缩表的性能?

A9: 优化压缩表性能的方法:

  1. 选择合适的压缩级别和压缩类型
  2. 创建合适的索引,提高查询性能
  3. 对大表进行分区,不同分区使用不同的压缩级别
  4. 定期维护压缩表,如 VACUUM、ANALYZE 等
  5. 调整数据库参数,如 shared_buffers、work_mem 等

Q10: 压缩配置可以随时修改吗?

A10: 压缩配置可以随时修改:

  1. 使用 ALTER TABLE 命令修改表的压缩配置
  2. 修改压缩配置是在线操作,不会阻塞表的访问
  3. 但修改压缩配置后,只有新插入的数据会使用新的压缩配置
  4. 对于已存在的数据,需要重建表或使用 VACUUM FULL 进行重新压缩