首批通过分布式安全可靠测评,为关键业务系统打造
编码和压缩
更新时间:2026-06-16 09:21
本文主要介绍 OceanBase 数据库中存储层基于宏块/微块的编码和压缩功能。
适用版本
OceanBase 数据库所有版本。
什么是 encoding
微块是 OceanBase 数据库的 SSTable 中存储一组有序行数据的变长数据块,多个微块封装在一个宏块内,每个微块的默认大小会在 16KB 左右。 OceanBase 数据库读 SSTable 会以微块为粒度做 cache 和 IO,相应地也会以微块为粒度对数据进行压缩(通用压缩)和编码(encoding)。
通用压缩使用的是不感知数据的无损压缩算法(zstd、lz4 等),与之相对应的 encoding 是感知数据内容的,在微块内行列混存,对一组行数据进行按列存储的编码方式。目前支持了字典、游程、差值、前缀、列间等编码。相比于 flat 格式的微块(行存),encoding 格式的微块可以提供更高的压缩率,以解码的 CPU 消耗为代价来换取 IO 量和存储空间的降低,同时部分编码能够提供更好的批量解码/扫描能力。
SSTable 数据的写入都是在 compaction 的过程中进行的,目前 OceanBase 数据库只对基线数据进行了 encoding。通常写入时会对数据块先做 encoding,再做一次通用压缩来保证压缩率。合并时数据是以宏块为粒度重用的,压缩算法和存储格式是以宏块作为区分的最小粒度,当压缩方式发生变更时,会通过渐进合并逐步重写所有的数据宏块来完成压缩算法的更新。
如何查看数据的压缩方式
- 在虚拟表
__all_virtual_table中,可以查看store_format字段来确定对应 table schema 上的压缩方式。 - 在虚拟表
__all_virtual_partition_sstable_macro_info(OceanBase 数据库 V4.0 之前)或__all_virtual_tablet_sstable_macro_info(OceanBase 数据库 V4.0 及以后)中,可以通过compressor_name和row_store_type来确定宏块级别的压缩方式。
如何设置一张表的存储格式
目前存储格式和压缩方法在 OceanBase 数据库中是表级的配置项,可以在建表时指定或建表后再通过 DDL 语句修改。
建表时指定
create table xxx row_format = $value compression = $value;
create table xxx $value;
DDL 修改
alter table xxx [set] row_format = $value compression = $value;
alter table xxx [move] $value;
配置项值域
| 值 | 微块格式 |
|---|---|
| redundant | flat |
| compact | flat |
| dynamic | encoding |
| compressed | encoding |
| condensed | selective encoding (encoding 的子集,只使用查询更友好的编码方式) |
- none
- lz4_1.0
- snappy_1.0
- zlib_1.0
- zstd_1.0
- zstd_1.3.8
- lz4_1.9.1
| 值 | 通用压缩 | 微块格式 |
|---|---|---|
| nocompress | none | flat |
| compress basic | lz4_1.0 | flat |
| compress for oltp | zstd_1.3.8 | flat |
| compress for query | lz4_1.0 | encoding |
| compress for archive | zstd_1.3.8 | encoding |
| compress for query low | lz4_1.0 | selective encoding (encoding 的子集,只使用查询更友好的编码方式) |