【强制】数据库字符集指定utf-8,并且只支持utf-8。
命令规范
FROM ("2000-01-01") TO ("2022-01-01") INTERVAL 1 YEAR
(
PARTITION p00010101_1899 VALUES [('0001-01-01'), ('1900-01-01')),
PARTITION p19000101 VALUES [('1900-01-01'), ('1900-01-02')),
...
PARTITION p19000104_1999 VALUES [('1900-01-04'), ('2000-01-01')),
FROM ("2000-01-01") TO ("2022-01-01") INTERVAL 1 YEAR,
PARTITION p30001231 VALUES [('3000-12-31'), ('3001-01-01')),
PARTITION p99991231 VALUES [('9999-12-31'), (MAXVALUE))
)
【强制】如果分桶字段存在30%以上的数据倾斜,则禁止使用Hash分桶策略,改使用random分桶策略
【建议】前缀索引的第一个字段一定是最长查询的字段,并且需要是高基字段。这里面选取分区分桶外最长查询且高基数的列
good case :UNIQUE KEY(user_id
,?age
) user_id最长被查询,且数据分布比较散
bad case :UNIQUE KEY(age
,user_id
?) age是低基数列,且可能存在数据倾斜
【强制】表的副本数必须为3
【建议】前缀索引中的字段长度尽可能明确,因为Doris只有前36个字节能走前缀索引
【强制】除了UNIQUE KEY和aggregate key要构建key的情况,否则不要基数(例如user_type)小于50的字段建立任何索引。因为Doris内置了字典类型优化。
【强制】BloomFilter索引必须在查询条件是in或者=,并且是高基(5000以上)列上构建。
【强制】bitmap索引必须在一定基数范围内构建,太高或者太低的基数都不合适
TINYINT
SMALLINT
INT
BIGINT
CHAR
VARCHAR
DATE
DATETIME
LARGEINT
DECIMAL
BOOL
【强制】亿级别以上数据,如果有模糊匹配,使用倒排索引或者是 NGram Bloomfilter
【建议】如果某个范围数据在分区分桶和前缀索引中都不好设计,可以考虑引入倒排索引加速。
【强制】单表物化视图不能超过6个
【建议】建议使用JSON数据类型代替字符串类型存放JSON数据的使用方式
【强制】应用程序不可以直接使用delete后者update语句变更数据,使用CDC的upsert方式来实现。
【强制】DBA执行delete后者update语句时必须带分区条件
【强制】禁止使用INSERT INTO tbl1 VALUES ("1"), ("a");这种方式写入数据。
【建议】特殊大的ETL操作,简单单独在Session中设置超时时间
SELECT
/*+ SET_VAR(query_timeout = 1*/ sleep(3);
?类似这样通过Hint方式去设置Session 会话变量,不要设置全局的系统变量【强制】in 中条件超过 2000 后,必须修改为子查询
【强制】禁止使用REST API(Statement Execution Action)执行大量SQL查询,改接口仅仅用于集群维护。
【建议】一次insert into select 数据超过1亿条后,建议拆分为多个insert into select语句执行,分成多个批次来执行。
如果真的是要这样执行,在集群资源相对空闲的时候可以通过调整并发度来加快的数据导入速度
2.0 以后版开启了Pipeline 就不需要设置并发度了
set parallel_fragment_exec_instance_num = 8 或者 16 建议是你CPU内核的一半
insert into new_tbl select * from old_tbl
【强制】query查询条件返回结果在5w条以上,使用JDBC Catalog或者OUTFILE方式导出。不然大量FE上数据传输将占用FE资源,影响集群稳定性
【建议】query查询如果有大量的数据传输需求,建议部署observer节点并在该该节点执行查询(私有化部署)
【建议】尽量不要使用OR 作为 JOIN条件
【建议】大量数据排序(5亿以上)后返回部分数据,建议先减少数据范围在执行排序,否则大量排序会影响性能。
select * from kunpeng_risk_record krr where krr.event_occur_time_date between '2023-10-01 00:00:00' and '2023-10-25 23:59:59' and krr.partner_code = 'liveme' order by krr.sequence_id desc limit 20;
例如将?from table order by datatime desc limit 10 优化为from table where datatime='2023-10-20' order by datatime desc limit 10
【强制】2个以上大于3亿的表 JOIN 使用 Colocate JOIN
【强制】亿级别大表禁止使用select * 查询,查询时需要明确要查询的字段
SQL Block方式禁止这种操作
如果是高并发点查,建议开启行存
表属性级别
"enable_unique_key_merge_on_write" = "true",
"store_row_column" = "true"
be.conf
disable_storage_row_cache 是否开启行缓存, 默认不开启
【强制】亿级以上表数据查询必须带分区分桶条件