跳到主要内容

表类型概述

在 Doris 中建表时需要指定表类型,以定义数据存储与管理方式。在 Doris 中提供了明细表、聚合表以及主键表三种表类型,可以应对不同的应用场景需求。不同的表类型具有相应的数据去重、聚合及更新机制。选择合适的表类型有助于实现业务目标,同时保证数据处理的灵活性和高效性。

表类型分类

在 Doris 中支持三种表类型:

  • 明细表(Duplicate Key Table):允许指定的 Key 列重复,Doirs 存储层保留所有写入的数据,适用于必须保留所有原始数据记录的情况;

  • 主键表(Unique Key Table):每一行的 Key 值唯一,可确保给定的 Key 列不会存在重复行,Doris 存储层对每个 key 只保留最新写入的数据,适用于数据更新的情况;

  • 聚合表(Aggregate Key Table):可根据 Key 列聚合数据,Doris 存储层保留聚合后的数据,从而可以减少存储空间和提升查询性能;通常用于需要汇总或聚合信息(如总数或平均值)的情况。

在建表后,表类型已经确认,无法修改。针对业务选择合适的类型至关重要:

  • Duplicate Key Table:适合任意维度的 Ad-hoc 查询。虽然同样无法利用预聚合的特性,但是不受聚合表的约束,可以发挥列列存的优势(只读取相关列,而不需要读取所有 Key 列)。

  • Unique Key Table:针对需要唯一主键约束的场景,可以保证主键唯一性约束。但是无法利用 ROLLUP 等预聚合带来的查询优势。

  • Aggregate Key Table:可以通过预聚合,极大地降低聚合查询时所需扫描的数据量和查询的计算量,非常适合有固定模式的报表类查询场景。但是该类型表对 count(*) 查询很不友好。同时因为固定了 Value 列上的聚合方式,在进行其他类型的聚合查询时,需要考虑语意正确性。

  • 部分列更新:请查阅文档主键表部分列更新聚合表部份列更新获取相关使用建议。

排序键

在 Doris 中,数据以列的形式存储,一张表可以分为 key 列与 value 列。其中,key 列用于分组与排序,value 列用于参与聚合。Key 列可以是一个或多个字段,在建表时,按照各种表类型中,Aggregate Key、Unique Key 和 Duplicate Key 的列进行数据排序存储。

不同的表类型都需要在建表时指定 Key 列,分别有不同的意义:对于明细表,Key 列表示排序,没有唯一键的约束。在聚合表与主键表中,会基于 Key 列进行聚合,Key 列既有排序的能力,又有唯一键的约束。

合理使用排序键可以带来以下收益:

  • 加速查询性能:排序键有助于减少数据扫描量。对于范围查询或过滤查询,可以利用排序键直接定位数据的位置。对于需要进行排序的查询,也可以利用排序键进行排序加速;

  • 数据压缩优化:数据按排序键有序存储会提高压缩的效率,相似的数据会聚集在一起,压缩率会大幅度提高,从而减小数据的存储空间。

  • 减少去重成本:当使用 Unique Key 表时,通过排序键,Doris 能更有效地进行去重操作,保证数据唯一性。

选择排序键时,可以遵循以下建议:

  • Key 列必须在所有 Value 列之前。

  • 尽量选择整型类型。因为整型类型的计算和查找效率远高于字符串。

  • 对于不同长度的整型类型的选择原则,遵循够用即可。

  • 对于 VARCHARSTRING 类型的长度,遵循够用即可原则。

表类型能力对比

明细表主键表聚合表
Key 列唯一约束不支持,Key 列可以重复支持支持
同步物化视图支持支持支持
异步物化视图支持支持支持
UPDATE 语句不支持支持不支持
DELETE 语句部分支持支持不支持
导入时整行更新不支持支持不支持
导入时部分列更新不支持支持部分支持