本文主要是介绍DORIS - DORIS注意事项(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
建表建议
1. Key 列必须在所有 Value 列之前。
2. 尽量选择整型类型。因为整型类型的计算和查找效率远高于字符串。
3. 对于不同长度的整型类型的选择原则,遵循够用即可。
4. 对于 VARCHAR 和 STRING 类型的长度,遵循够用即可。
注意事项
1. 建表时,未指定 Unique、Aggregate 或 Duplicate 时,默认创建一个 Duplicate 模型的表,数据模型在建表时就已经确定,且无法修改。
2. 明细模型未指定排序列时,默认系统自动选定了前 3 列为排序列。
3. 建表时,指定 Duplicate Key,用来指明数据存储按照这些 Key 列进行排序,建议选择前 2-4 列为排序列。
4. 主键模型默认的更新语意为整行UPSERT,即 UPDATE OR INSERT,该行数据的 key 如果存在,则进行更新,如果不存在,则进行新数据插入。所以,在整行UPSERT语意下,即使用户使用 insert into 指定部分列进行写入,Doris 也会在 Planner 中将未提供的列使用 NULL 值或者默认值进行填充。如果用户希望更新部分字段,需要使用写时合并实现,并通过特定的参数来开启部分列更新的支持。
5. 主键模型表的实现方式只能在建表时确定,无法通过 schema change 进行修改。
6. 聚合模型根据表中的列是否设置了AggregationType来区分 key 列还是value 列,也就是要么是 key 列,要么是 value 列。
7. 聚合模型中的agg_state 是一种数据类型,同 int/array/string 意义一样,agg_state 只能配合state /merge/union函数组合器使用,agg_state 存在一定的性能开销。
8. 在插入数据时,agg_state 类型的数据,需要使用 state 函数来生成:insert into aggstate values(1,sum_state(1),group_concat_state('a'));
9. 聚合模型,在 count(*) 查询中,Doris 必须扫描所有的 AGGREGATE KEY 列并且聚合后,才能得到语意正确的结果。 当聚合列非常多时,count(*) 查询需要扫描大量的数据。
10. 聚合模型,当业务上有频繁的 count(*) 查询时,建议用户通过增加一个值恒为 1 的列,查询时,使用聚合类型为 SUM 的列来模拟 count(*),使用 select sum(值恒为1的列名) from table_name; 来替代 select count(*) from table_name; 前者性能远高后后者。不过这种方式也有使用限制,就是用户需要自行保证,不会重复导入 AGGREGATE KEY 列都相同地行。另一种方式,就是将如上的 count 列的聚合类型改为 REPLACE,且依然值恒为 1。那么 select sum(值恒为1的列名) from table_name; 和 select count(*) from table_name; 的结果将是一致的。并且这种方式,没有导入重复行的限制。
11. Duplicate、Aggregate、Unique 模型,都会在建表指定 Key 列,然而实际上是有所区别的:对于 Duplicate 模型,表的 Key 列,可以认为只是 "排序列",并非起到唯一标识的作用;而 Aggregate、Unique 模型这种聚合类型的表,Key 列是兼顾 "排序列" 和 "唯一标识列",是真正意义上的 "Key 列"。
12. 主键模型,针对需要唯一主键约束的场景,可以保证主键唯一性约束,但是无法利用 ROLLUP 等预聚合带来的查询优势。
13. 明细模型,适合任意维度的 Ad-hoc 查询,虽然同样无法利用预聚合的特性,但是不受聚合模型的约束,可以发挥列存模型的优势。
14. 在 Doris 中,数据都以表(Table)的形式进行逻辑上的描述,一张表包括行(Row)和列(Column)。
15. 在 Doris 中,列可以分为两大类:Key 和 Value,从业务角度看,Key 和 Value 可以分别对应维度列和指标列。Doris 的 key 列是建表语句中指定的列,建表语句中的关键字'unique key'或'aggregate key'或'duplicate key'后面的列就是 key 列,除了 key 列剩下的就是 value 列。从聚合模型的角度来说,Key 列相同的行,会聚合成一行,其中 Value 列的聚合方式由用户在建表时指定。
16. Doris 支持两层的数据划分,第一层是分区(Partition),第二层是 Bucket(Tablet)。
17. 数据被水平划分为若干个数据分片(Tablet,也称作数据分桶),每个 Tablet 包含若干数据行,各个 Tablet 之间的数据没有交集,并且在物理上是独立存储的。
18. 一个 Tablet 只属于一个分区,一个分区包含若干个 Tablet,若干个分区组成一个 Table。Tablet 是数据移动、复制等操作的最小物理存储单元,分区可以视为是逻辑上最小的管理单元。
19. 时间维度 或者 类似于带有有序值的维度,可以用这类维度列作为分区列,不论分区列是什么类型,在写分区值时,都需要加双引号。
20. 分桶列建议选择区分度大的列。
21. 分区只支持 Range 和 List两种方式,分桶只支持 Hash 和 Random 两种方式。
22. 在 Doris 中,只有 OLAP 这个 ENGINE 类型是由 Doris 负责数据管理和存储的,其他的 ENGINE 类型,如 MySQL、 Broker、ES 等等,本质上只是对外部其他数据库或系统中的表的映射,以保证 Doris 可以读取这些数据,而 Doris 本身并不创建、管理和存储任何非 OLAP ENGINE 类型的表和数据。
23. 建表时若不建立分区,Doris 会生成一个和表名同名的默认的分区,这个分区对用户是透明的,使用默认分区时,只支持 Bucket 划分。
24. 分区列可以指定一列或多列,分区列必须为 KEY 列,创建分区时不可添加范围重叠的分区,分区数量理论上没有上限。
25. 动态分区只支持在 DATE/DATETIME 列上进行 Range 类型的分区。
这篇关于DORIS - DORIS注意事项(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!