---
title: 编码和压缩-OceanBase数据库使用指南
description: 了解OceanBase数据库在实际应用中关于编码和压缩相关的常见问题和使用技巧，帮助您快速解决编码和压缩的难题。
---
切换语言

- 简体中文
- English

划线反馈

# 编码和压缩

更新时间：2026-06-16 09:21

适用版本： V1.4.x、V2.1.x、V2.2.x、V3.1.x、V3.2.x、V4.0.x、V4.1.x、V4.2.x 内容类型：TechNote  

本文主要介绍 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 语句修改。

**建表时指定**

    MySQL 模式   Oracle 模式

```sql
create table xxx row_format = $value compression = $value;

```

```sql
create table xxx $value;

```

**DDL 修改**

```sql
alter table xxx [set] row_format = $value compression = $value;

```

```sql
alter table xxx [move] $value;

```

**配置项值域**

    MySQL 模式 - row_format   MySQL 模式 - compression   Oracle 模式

| 值 | 微块格式 |
| --- | --- |
| 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 的子集，只使用查询更友好的编码方式) |

Previous

[合并切主失败问题排查](https://www.oceanbase.com/knowledge-base/oceanbase-database-1000000000899040)

Next

[OceanBase 数据库 V2.X 版本的缓存预热功能](https://www.oceanbase.com/knowledge-base/oceanbase-database-20000000047) ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
