Skip to content

OceanBase 表压缩

压缩类型

透明压缩

  • 定义:对用户透明,不需要修改应用程序代码
  • 适用场景:所有类型的表,特别是大数据量的表
  • 优势:使用简单,对应用程序无影响
  • 劣势:压缩率相对较低

行压缩

  • 定义:按行进行压缩,适合频繁更新的表
  • 适用场景:OLTP 系统,频繁更新的表
  • 优势:更新操作只影响单行,压缩和解压缩开销小
  • 劣势:压缩率相对较低

列压缩

  • 定义:按列进行压缩,适合数据分析场景
  • 适用场景:OLAP 系统,数据分析表
  • 优势:压缩率高,适合批量查询
  • 劣势:更新操作开销大,不适合频繁更新的表

混合压缩

  • 定义:结合行压缩和列压缩的优点
  • 适用场景:同时需要高压缩率和良好更新性能的场景
  • 优势:兼顾压缩率和更新性能
  • 劣势:实现复杂,资源开销较大

压缩配置

压缩级别

OceanBase 支持多种压缩级别,从低到高依次为:

  • NO_COMPRESS:不压缩
  • LOW:低压缩率,低 CPU 开销
  • MEDIUM:中等压缩率,中等 CPU 开销
  • HIGH:高压缩率,高 CPU 开销
  • ULTRA:超高压缩率,超高 CPU 开销

压缩算法

OceanBase 支持多种压缩算法:

  • LZ4:高速压缩算法,适合对性能要求高的场景
  • ZSTD:平衡压缩率和性能的算法,适合大多数场景
  • GZIP:高压缩率算法,适合对压缩率要求高的场景
  • BZIP2:超高压缩率算法,适合归档场景

表压缩使用方法

创建表时启用压缩

行压缩示例

sql
-- 创建使用行压缩的表
CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    department VARCHAR(50),
    salary DECIMAL(10, 2)
) COMPRESS FOR ROW LZ4 MEDIUM;

列压缩示例

sql
-- 创建使用列压缩的表
CREATE TABLE sales (
    id INT PRIMARY KEY,
    product_id INT,
    sale_date DATE,
    amount DECIMAL(10, 2),
    region VARCHAR(50)
) COMPRESS FOR COLUMN ZSTD HIGH;

修改现有表的压缩设置

修改压缩类型

sql
-- 将表修改为使用行压缩
ALTER TABLE employees COMPRESS FOR ROW LZ4 MEDIUM;

-- 将表修改为使用列压缩
ALTER TABLE sales COMPRESS FOR COLUMN ZSTD HIGH;

禁用压缩

sql
-- 禁用表压缩
ALTER TABLE employees NOCOMPRESS;

压缩分区表

对特定分区启用压缩

sql
-- 创建分区表,对不同分区使用不同的压缩设置
CREATE TABLE sales_partitioned (
    id INT PRIMARY KEY,
    product_id INT,
    sale_date DATE,
    amount DECIMAL(10, 2),
    region VARCHAR(50)
) PARTITION BY RANGE (sale_date) (
    PARTITION p202301 VALUES LESS THAN ('2023-02-01') COMPRESS FOR COLUMN ZSTD HIGH,
    PARTITION p202302 VALUES LESS THAN ('2023-03-01') COMPRESS FOR COLUMN ZSTD HIGH,
    PARTITION p202303 VALUES LESS THAN ('2023-04-01') COMPRESS FOR COLUMN ZSTD HIGH,
    PARTITION p202304 VALUES LESS THAN (MAXVALUE) NOCOMPRESS
);

查看表压缩信息

查看表的压缩设置

sql
-- 查看表的压缩设置
SELECT table_name, compression, compression_type, compression_level
FROM user_tables
WHERE table_name = 'EMPLOYEES';

查看表的压缩率

sql
-- 查看表的压缩率
SELECT table_name, blocks, empty_blocks, num_rows,
       ROUND((blocks - empty_blocks) * 8192 / 1024 / 1024, 2) AS used_mb,
       ROUND(compressed_bytes / 1024 / 1024, 2) AS compressed_mb,
       ROUND((1 - compressed_bytes / ((blocks - empty_blocks) * 8192)) * 100, 2) AS compression_rate
FROM user_tables
WHERE table_name = 'EMPLOYEES';

压缩最佳实践

1. 选择合适的压缩类型

  • OLTP 系统:建议使用行压缩,压缩级别设置为 LOW 或 MEDIUM
  • OLAP 系统:建议使用列压缩,压缩级别设置为 HIGH 或 ULTRA
  • 归档数据:建议使用列压缩,压缩级别设置为 ULTRA

2. 选择合适的压缩算法

  • 性能优先:选择 LZ4 算法
  • 平衡考虑:选择 ZSTD 算法
  • 压缩率优先:选择 GZIP 或 BZIP2 算法

3. 分区表压缩策略

  • 热数据:使用低压缩级别或不压缩
  • 温数据:使用中等压缩级别
  • 冷数据:使用高压缩级别
  • 归档数据:使用超高压缩级别

4. 压缩时机

  • 创建表时启用压缩:适合新建表
  • 批量导入后压缩:适合大批量数据导入场景
  • 定时压缩:适合数据增长缓慢的表

5. 监控压缩效果

  • 定期查看表的压缩率
  • 监控压缩对 CPU 使用率的影响
  • 监控压缩对查询和写入性能的影响
  • 根据监控结果调整压缩策略

常见问题(FAQ)

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

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

  • CPU 资源:CPU 资源充足时可以选择更高的压缩级别
  • I/O 性能:I/O 性能瓶颈时可以选择更高的压缩级别
  • 写入频率:写入频率高时建议选择较低的压缩级别
  • 数据类型:不同类型的数据压缩率差异较大,建议进行测试

Q2: 压缩对写入性能有影响吗?

A2: 压缩对写入性能有一定的影响,具体影响程度取决于:

  • 压缩级别:压缩级别越高,写入性能影响越大
  • 压缩算法:不同压缩算法对写入性能的影响不同
  • 数据量:数据量越大,压缩对写入性能的影响越大
  • CPU 资源:CPU 资源充足时,压缩对写入性能的影响较小

Q3: 如何评估压缩效果?

A3: 评估压缩效果可以从以下几个方面入手:

  • 压缩率:计算压缩前后的数据量比例
  • CPU 使用率:监控压缩和解压缩操作对 CPU 使用率的影响
  • 查询性能:比较压缩前后的查询性能
  • 写入性能:比较压缩前后的写入性能
  • 存储成本:计算压缩带来的存储成本节约

Q4: 可以对索引进行压缩吗?

A4: 是的,OceanBase 支持对索引进行压缩。可以在创建索引时指定压缩设置,例如:

sql
-- 创建压缩索引
CREATE INDEX idx_employees_name ON employees(name) COMPRESS FOR ROW LZ4 MEDIUM;

Q5: 压缩表如何进行备份和恢复?

A5: 压缩表的备份和恢复与普通表相同,OceanBase 会自动处理压缩和解压缩操作。在备份时,压缩表的数据会以压缩格式存储,减少备份数据量;在恢复时,会自动解压数据,对用户透明。