Doris 入门:高级特性(四)

一、表结构变更

  • 添加列: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
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值