目录
- 一、表结构变更
- 二、Rollup
- 三、增大内存
- 四、修改超时时间
- 五、Broadcast/Shuffle Join
- 六、数据模型
- 七、索引
- 八、物化视图
- 九、动态分区
- 十、数据导出
- 十一、Colocation Join
- 十二、SQL 函数
一、表结构变更
- 添加列: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
- 在 Base 表上创建一个 Rollup 表,把字节小的字段放前面,匹配的适合先命中 Rollup 表
- 概念
- 概念
- 概念
- 概念
- select sum(table1.pv) from table1 join [shuffle] table2 where table1.siteid = 1;
- 概念
- 概念
猜你喜欢
网友评论
- 搜索
- 最新文章
- 热门文章