表类型概述
在 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 列之前。
-
尽量选择整型类型。因为整型类型的计算和查找效率远高于字符串。
-
对于不同长度的整型类型的选择原则,遵循够用即可。
-
对于
VARCHAR
和STRING
类型的长度,遵循够用即可原则。
表类型能力对比
明细表 | 主键表 | 聚合表 | |
---|---|---|---|
Key 列唯一约束 | 不支持,Key 列可以重复 | 支持 | 支持 |
同步物化视图 | 支持 | 支持 | 支持 |
异步物化视图 | 支持 | 支持 | 支持 |
UPDATE 语句 | 不支持 | 支持 | 不支持 |
DELETE 语句 | 部分支持 | 支持 | 不支持 |
导入时整行更新 | 不支持 | 支持 | 不支持 |
导入时部分列更新 | 不支持 | 支持 | 部分支持 |