Doris 的高级特性

时间:2023-01-16 12:02:44

一、表结构变更

添加列:alter table table1 add column uv bigint sum default ‘0’ after pv;

删除列:alter table table1 drop column uv;

查看状态:show alter table column;

取消操作:cancel alter table column from table1;

二、Rollup

概念

在 Doris 中,源表称为 Bash 表,在 Base 表之上可以创建多个 Rollup 表,Rollup 表是基于 Base 表产生,在物理上是独立存储

Rollup 最根本的作用就是提高某些查询效率,Rollup 创建完成之后的触发是程序自动的,数据更新与 Base 表完全同步

在创建 Rollup 无需指定,也不能修改,查询能否命中 Rollup 的必要条件是查询所涉及的所有列都存在 Rollup 的列中

创建

alter table table2 add rollup rollup_city(citycode,pv);

desc table2;

查看完成状态

show alter table rollup;

查询执行计划是否命中

explain select citycode,sum(pv) from table2 group by citycode;

查看是否有 rollup: rollup_city

三、增大内存

Doris 每个用户默认设置内存限制 2g,SHOW VARIABLES LIKE “%mem_limit%” 命令查看

临时修改:SET exec_mem_limit = 123456789;

永久有效:SET GLOBAL exec_mem_limit = 123456789;

四、修改超时时间

查看:show variables like “%query_timeout%”;

临时修改:SET query_timeout = 60;

永久有效:SET global query_timeout = 60;

五、Broadcast/Shuffle Join

概念

Doris 在 join 操作的时候,默认使用 broadcast 的方式进行 join,即将小表通过广播的方式播到大表所在的节点,形成内存 hash,然后流式读出大表数据进行 hash join

如果小表数据量也很大的时候,会造成内存溢出,需要通过 shuffle join 的方式进行,也被称为 partition join,即将大表小表都按照 join 的 key 进行 hash,然后进行分布式 join

Broadcast 适合小表和大表 join,Shuffle join 适合大表和大表

使用 Broadcast Join 默认

select sum(table1.pv) from table1 join table2 where table1.siteid = 1;

显示指定:select sum(table1.pv) from table1 join [broadcast] table2 where table1.siteid = 1;

使用 Shuffle Join

select sum(table1.pv) from table1 join [shuffle] table2 where table1.siteid = 1;

六、数据模型

概念

在 Doris 中,数据以表 Table 的形式进行逻辑上的描述,一张表包括 行 Row 和 列 Column。

Row 是一行数据,Column 是一行数据中的不同字段,Column 可以分为 Key(纬度列)和 Value(指标列)两大类

Aggregate 模型

概念

聚合模型的特点就是将表中的列分为 Key 和 Value 两种,Key 就是数据的纬度列,Value 就是数据的指标列,每个指标列还会有自己的聚合函数,数据会根据纬度列进行分组,并对指标列进行聚合

选择建议

Aggregate 模型可以通过预聚合,极大降低聚合查询时需要扫描的数据量和查询的计算量,非常适合有固定模式的报表类查询场景

但是,对 count(*) 很不友好,做其他类型的聚合查询时,需要考虑语意正确性

聚合方式

SUM:求和,多行 Value 进行累加

REPLACE:替代,下一批数据的 Value 会替换之前导入过的 Value

MAX:保留最大值

MIN:保留最小值

触发场景

导入、Compaction 合并、查询

明细数据问题

经过聚合之后,Doris 中最终只会存储聚合后的数据,换句话来说,明细数据会丢失,用户不能够再查询到聚合前的明细数据

要保留明细数据可以添加一个时间戳 timestamp DATETIME 字段,让它的 key 都不相同

导入数据与已有数据聚合问题

先导的数据和新导入的数据之间有相同的适合,也是需要进行一个合并的

Uniq 模型

概念

唯一主键模型,本质是聚合模型的 REPLACE 方式、一个特例

场景

适合数据需要保证主键唯一性,没有聚合需求的场景,可以保证主键唯一性约束

选择建议

需要唯一主键约束的场景,但是无法利用 Rollup 等预聚合带来的查询优势

Duplicate 模型

概念

Duplicate Key 的模型,数据完全按照导入文件中的数据进行存储,不会有任何聚合,即两行数据完全相同,也都会保留

在建表语句中指定的 DUPLICATE KEY,只是用来指明底层数据按照那些列进行排序

场景

对于有些日志分析不太在意数据多几条或者少几条,可能只关心排序,这时候可能重复 Key 的模型会更加有效果

适合既没有主键,也没有聚合需求的场景,可以发挥列存模型的优势

选择建议

Duplicate 适合任意纬度的 Ad-hoc 查询,虽然不能利用预聚合的特性,但是不受聚合模型的约束,可以发挥列存模型的优势

注意:数据模型在建表的时候已经确定,且无法修改,选择一个合适的数据模型非常重要

七、索引

概念:用于帮助快速过滤或查找数据

分类

内建的智能索引,包括前缀索引和 ZoneMap 索引

用户创建的二级索引,包括 Bloom Filter 索引和 Bitmap 倒排索引

Doris 前缀索引

概念:在排序的基础上,实现一种根据给定前缀列,快速查询数据的索引方式,将一行数据的前 36个字节 作为这一行数据的前缀索引,遇到 varchar 类型直接截断

匹配规则

Doris 的前缀索引应用于 on 和 where,且条件表达式需要是 =,<,>,<=,>=,in,between 逻辑表达式需要是 and

where 举例:第一个条件字段和前缀索引的第一个字段进行比较,如果匹配上,继续往下比较,如果匹配不上,停止比较,后面的字段匹配原理和第一个字段一样

Rollup 调整前缀索引

在 Base 表上创建一个 Rollup 表,把字节小的字段放前面,匹配的适合先命中 Rollup 表

八、物化视图

概念:包含了查询结果的数据库对象,在 Doris 中的物化视图,就是查询结果预先存储起来的特殊表

优势

对于经常重复使用相同的子查询结果的查询性能大幅提升

Doris 自动更新物化视图的数据,保证 base 表和物化视图的数据一致性,无需额外的维护成本

查询的适合也可以自动匹配最优的物化视图

Rollup 对比

Rollup 功能通过预聚合方式提升查询效率,但 Rollup 具有一定的局限性,不能基于明细模型做预聚合,物化视图包含了 Rollup 的功能,同时又提供了更多功能,是 Rollup 的一个超集

创建

CREATE MATERIALIZED VIEW mv_1 AS SELECT a,b,SUM© FROM table GROUP BY a,b;

匹配

先判断 where 是否有这个字段,再判断 select 是否有这个字段

其他点

操作:支持聚合函数,Drop 删除

局限性:聚合仅支持单列;删除数据的时候如果条件列不在视图里,需要先删视图;视图过多会影响导入效率;相同列不同聚合函数不能出现在同一视图内;针对 Unique Key 模型只能改变顺序,不能起到聚合功能

九、动态分区

官方文档:https://doris.apache.org/zh-CN/docs/advanced/partition/dynamic-partition

功能

对表级别的分区实现生命周期管理,减少使用负担,建表的时候设定动态分区规则,FE 会启动一个后台线程,根据指定的规则创建或删除分区,运行时也可以变更

配置

fe.conf、MySQL、HTTP

注意

动态分区只支持 Range 分区

某些使用场景下,按天进行分区,每天定时执行例行任务,这时需要使用手动管理分区,否则可能由于没有创建分区导致数据导入失败,增加维护成本

十、数据导出

概述:以文本格式,通过 Broker 进程导出到远端存储上

官方文档:https://doris.apache.org/zh-CN/docs/data-operate/export/export-manual

十一、Colocation Join

概述:为某些 Join 查询提供本地性优化,来减少数据在节点间传输耗时,加速查询

原理:将拥有相同 Colocation Group Schema 的 Table 组成一个 Colocation Group,并保证这些 Table 对应数据分片会落在同一个 BE 节点上,进行 Join 操作时,可以直接进行本地数据 Join

官方文档:https://doris.apache.org/zh-CN/docs/advanced/join-optimization/colocation-join

十二、SQL 函数

查看函数名:show builtin functions in test_db;

数学函数

abs:返回绝对值

bin:返回整型的二进制表示

ceil(double a)/ceiling(double a)/dceil(double a):返回大于等于该参数的最小整数,向上取整

floor:向下取整

fmod:取模

greatest(bigint a[,bigint b …]):最大值

least(bigint a[,bigint b …]):最小值

mod:余数

negative:符号取反

pi:PI 值

pow(x,y):x 的 y 次方

positive:返回原值

rand/random:随机数

sign:整数或0 返回 1,负数返回 -1

sqrt:返回 a 的平方根

日期函数

https://doris.apache.org/zh-CN/docs/sql-manual/sql-functions/date-time-functions/convert_tz/

地理位置函数

https://doris.apache.org/zh-CN/docs/sql-manual/sql-functions/spatial-functions/st_astext

字符串函数

https://doris.apache.org/zh-CN/docs/sql-manual/sql-functions/string-functions/ascii

聚合函数

https://doris.apache.org/zh-CN/docs/sql-manual/sql-functions/aggregate-functions/approx_count_distinct

Bitmap 函数

https://doris.apache.org/zh-CN/docs/sql-manual/sql-functions/bitmap-functions/to_bitmap