Doris组件使用规范
本章节介绍Doris组件使用规范。
建表规范
- 【强制】创建表指定分桶buckets时,每个桶的数据大小为应保持在100M-3G之间,单分区中最大分桶数据不超过5000。
- 【强制】表数据超过5亿条以上必须设置分区分桶策略。
- 【强制】分桶的列不要设置太多,一般情况下1或2个列,同时需要兼顾数据分布均匀和查询吞吐之间的均衡,考虑数据均匀是为了避免某些桶的数据存在倾斜影响数据均衡和查询效率,考虑查询吞吐是为了利用查询SQL的分桶剪裁优化避免全桶扫描提升查询性能,所以优先考虑哪些数据较为均匀且常用于查询条件的列适合做分桶列。
- 【强制】2000kw 以内数据禁止使用动态分区(动态分区会自动创建分区,而小表用户客户关注不到,会创建出大量不使用分区分桶)。
- 【强制】创建表时的副本数必须至少为2,默认是3,禁止使用单副本。
- 【建议】单表物化视图不能超过6个。
- 【建议】对于有大量历史分区数据,但是历史数据比较少,或者不均衡,或者查询概率的情况,使用如下方式将数据放在特殊分区:
- 对于历史数据,如果数据量比较小我们可以创建历史分区(比如年分区,月分区),将所有历史数据放到对应分区里。
- 创建历史分区方式:FROM ("2000-01-01") TO ("2022-01-01") INTERVAL 1 YEAR。
- 【建议】1000w-2亿以内数据为了方便可以不设置分区,直接用分桶策略(不设置其实Doris内部会有个默认分区)。
- 【建议】如果分桶字段存在30%以上的数据倾斜,则禁止使用Hash分桶策略,改使用random分桶策略:Create table ... DISTRIBUTED BY RANDOM BUCKETS 10 ...
- 【建议】建表时第一个字段一定是最常查询使用的列,默认有前缀索引快速查询能力,选取分区分桶外最长查询且高基数的列,前缀索引36位,如果列超长也不能使用前缀索引能力。
- 【建议】亿级别以上数据,如果有模糊匹配或者等值/in条件,可以使用倒排索引或者是 Bloomfilter。如果是低基数列的正交查询适合使用bitmap索引。
- 【强制】Doris 建表不要指定Merge-On-Write属性,当前有很多开源问题,不推荐。如使用了该属性,CloudTable服务不承诺SLA。
数据变更类
- 【强制】应用程序不可以直接使用delete后者update语句变更数据,可以使用CDC的upsert方式来实现。
- 低频操作上使用,比如Update几分钟更新一次。
- 如果使用Delete一定带上分区条件。
- 【强制】禁止使用INSERT INTO tbl1 VALUES (“1”), (“a”);这种方式做数据导入,少量少次写可以,多量多频次时要使用Doris提供的StreamLoad、BrokerLoad、SparkLoad或者Flink Connector方式。
- 【建议】执行特殊的长SQL操作时,可以使用SELECT /*+ SET_VAR(query_timeout = xxx*/ from table 类似这样通过Hint方式去设置Session 会话变量,不要设置全局的系统变量。
命名规范
- 【强制】数据库字符集指定utf-8,并且只支持utf-8。
- 【建议】库名统一使用小写方式,中间用下划线(_)分隔,长度62字节内。
- 【建议】表名称大小写敏感,统一使用小写方式,中间用下划线(_)分隔,长度64字节内。
数据查询规范
- 【强制】in中条件超过2000后,必须修改为子查询。
- 【强制】禁止使用REST API(Statement Execution Action)执行大量SQL查询,该接口仅仅用于集群维护。
- 【建议】一次insert into select数据超过1亿条后,建议拆分为多个insert into select语句执行,分成多个批次来执行。如果非要这样执行不可,必须在集群资源相对空闲的时候可以通过调整并发度来加快的数据导入速度 。
例如:set parallel_fragment_exec_instance_num = 8 建议数值是单BE节点上CPU内核的一半。
- 【强制】query查询条件返回结果在5w条以上,使用JDBC Catalog或者OUTFILE方式导出。不然大量FE上数据传输将占用FE资源,影响集群稳定性。
- 如果是交互式查询,建议使用分页方式(offset limit),分页要加Order by。
- 如果是数据导出提供给第三方使用,建议使用 outfile或者export 方式。
- 【强制】2个以上大于3亿的表JOIN使用Colocation Join。
- 【强制】亿级别大表禁止使用select * 查询,查询时需要明确要查询的字段。
- 使用SQL Block方式禁止这种操作。
- 如果是高并发点查,建议开启行存(2.x版本)。
- 使用PreparedStatement查询。
- 【强制】亿级以上表数据查询必须带分区分桶条件。
- 【建议】尽量不要使用OR作为JOIN条件。
- 【建议】大量数据排序(5亿以上)后返回部分数据,建议先减少数据范围再执行排序,否则大量排序会影响性能。
例如:将from table order by datatime desc limit 10优化为from table where datatime='2023-10-20' order by datatime desc limit 10。