blob: 8a9c3022e5a4344973311402df7fee8a1f71af58 [file] [log] [blame] [view]
# Apache Doris 存储格式 V3 (Storage Format V3)
Doris 存储格式 V3 是在 Segment V2 格式基础上进行的重大演进。它通过元数据解耦与编码策略优化,专门针对大宽表、复杂数据类型(如 Variant)以及云原生存算分离场景提升性能。
## 1. 核心核心优化点
### 1.1 外部列元数据 (External Column Meta)
* **优化背景**:在 Segment V2 中,所有列的元数据(`ColumnMetaPB`)都存储在 Segment 文件的 Footer 中。对于拥有数千列的大宽表或自动扩容的 Variant 场景,Footer 可能会膨胀到几 MB
* **优化思路**:V3 `ColumnMetaPB` Footer 中剥离,转而存储在文件内的独立区域(External Column Meta Area)。
* **收益**:
* **极速元数据加载**:显著减小 Segment Footer 体积,加快文件初次打开速度。
* **按需加载**:元数据可以按需从独立区域加载,降低内存占用,提升对象存储(如 S3/OSS)上的冷启动查询性能。
### 1.2 数值类型 Plain 编码模式 (Integer Type Plain Encoding)
* **优化思路**:V3 默认将数值类型(如 `INT`, `BIGINT`)切换为 `PLAIN_ENCODING`(原始二进制存储),而非传统的 BitShuffle
* **收益**:配合 LZ4/ZSTD 压缩时,`PLAIN_ENCODING` 提供了更高的读取吞吐量和更低的 CPU 开销。在现代高速 IO 环境下,这种“解压换性能”的策略在扫描大体量数据时优势明显。
### 1.3 二进制 Plain 编码 V2 (Binary Plain Encoding V2)
* **优化思路**:引入 `BINARY_PLAIN_ENCODING_V2`,采用 `[长度(varuint)][原始数据]` 的流式布局,取代了依赖末尾偏移表(Offsets)的旧格式。
* **收益**:消除了末尾庞大的偏移表,数据存储更加紧凑,且更利于指令流水线进行顺序扫描(Vectorized Sequential Scan),提升了字符串和 JSONB 类型的扫描效率。
## 2. 设计哲学
V3 的设计哲学可以总结为:**“元数据解耦、编码简化、流式布局”**。通过减少元数据处理瓶颈和利用现代 CPU 对简单编码的高处理效率,实现在复杂模式下的高性能分析。
## 3. 使用场景
- **大宽表**:字段数量超过 2000 个以上,或字段名冗长。
- **半结构化数据**:大量使用 `VARIANT` 且物化列数超过2000列。
- **冷热分离/云原生**:对对象存储加载延迟敏感的场景。
- **高性能扫描**:对 Scan 吞吐量有极致要求的分析任务。
## 4. 使用方式
### 创建新表时启用
在建表语句的 `PROPERTIES` 中指定 `storage_format` `V3`
```sql
CREATE TABLE table_v3 (
id BIGINT,
data VARIANT
)
DISTRIBUTED BY HASH(id) BUCKETS 32
PROPERTIES (
"storage_format" = "V3"
);
```