首页 > 数据库 >聊聊分布式 SQL 数据库Doris(七)

聊聊分布式 SQL 数据库Doris(七)

时间:2023-11-28 13:35:30浏览次数:46  
标签:Hash Filter 右表 SQL Join 数据 Doris 分布式

LSM-Tree

Doris的存储结构是类似LSM-Tree设计的,因此很多方面都是通用的,先阅读了解LSM相关的知识,再看Doris的底层存储与读取流程会清晰透彻很多,如下是几个关键的设计:

SSTable: Sorted Strings Table; 一般由一组数据block和一组元数据block组成,数据是已序的。元数据会存储数据block的描述信息,如索引、BloomFilter、压缩、统计等信息。

MemTable: 内存里的表,有序且存储在Buffer中;可以用多种数据结构来组织,一般是用跳表(SkipList),也可以是有序数组或红黑树等二叉搜索树;最后会被转化成SSTable格式刷入磁盘持久化存储。

Compaction: 合并压缩SSTable。

参考:

LSM 树设计原理

LSM Tree索引:高性能写引擎

索引

官网文档: 索引概述.

Doris内建的索引: 前缀索引(Short key Index)、ZoneMap索引,默认是根据建表时的key列生成的。

Doris 的数据存储在类似 SSTable(Sorted String Table)的数据结构中。该结构是一种有序的数据结构,可以按照指定的列进行排序存储。在这种数据结构上,以排序列作为条件进行查找,会非常的高效。

在 Aggregate、Unique 和 Duplicate 三种数据模型中。底层的数据存储,是按照各自建表语句中,AGGREGATE KEY、UNIQUE KEY 和 DUPLICATE KEY 中指定的列进行排序存储的。因此在此排序列的基础上根据不同的场景构建内置的索引,提高查询的性能与效率。

Duplicate、Aggregate、Unique 模型,都会在建表指定 key 列,然而实际上是有所区别的:对于 Duplicate 模型,表的key列, 可以认为只是 “排序列”,并非起到唯一标识的作用。而 Aggregate、Unique 模型这种聚合类型的表,key 列是兼顾 “排序列” 和 “唯一标识列”,是真正意义上的“ key 列”。

参考: Apache Doris 索引机制解析

Join

官网文档: Doris Join 优化原理

概览

Doris 支持两种物理算子,一类是 Hash Join,另一类是 Nest Loop Join。

Doris 支持 4 种数据 Shuffle 方式:

  1. BroadCast Join: 要求把右表全量的数据都发送到左表上,即每一个参与 Join 的节点,它都拥有右表全量的数据

  2. Shuffle Join: 只支持hash join场景(即等值匹配). 当进行 Hash Join 时候,可以通过 Join 列计算对应的 Hash 值,并进行 Hash 分桶,并将分桶后的数据分散到节点中进行计算

  3. Bucket Shuffle Join: 右表数据扫描出来之后进行数据分区的 Hash 计算,根据左表本身的数据分布发送到右表对应的 Join 计算节点上。

  4. Colocation: 导入数据时,提前将join表的数据分散到一个节点

Runtime Filter

Doris 在进行 Hash Join 计算时会在右表构建一个哈希表,左表流式的通过右表的哈希表从而得出 Join 结果。而 RuntimeFilter 就是充分利用了右表的 Hash 表,在右表生成哈希表的时候,同时生成一个基于哈希表数据的一个过滤条件(Filter),然后下推到左表的数据扫描节点,通过这样的方式,左表在运行时(Runtime)提前进行数据过滤,提高查询效率。

Runtime Filter是分布式SQL查询引擎框架通用的一种优化手段,具体可参考: Join优化技术之Runtime Filter.

Runtime Filter涉及到的下推技术同样也是查询引擎框架常用的优化手段; 常见的下推优化技术有:谓词下推, 存储层下推等。

Doris支持的三种类型RuntimeFilter:

  1. IN 的优点是过滤效果明显,且快速。它的缺点首先第一个它只适用于 BroadCast,第二,它右表超过一定数据量的时候就失效了,当前 Doris 目前配置的是1024,即右表如果大于 1024,IN 的 Runtime Filter 就直接失效了,其余的RuntimeFileter则没有限制。
  2. MinMax 的优点是开销比较小。它的缺点就是对数值列还有比较好的效果,但对于非数值列,基本上就没什么效果。
  3. Bloom Filter 的特点就是通用,适用于各种类型、效果也比较好。缺点就是它的配置比较复杂并且计算较高。

使用场景的要求:

  1. 第一个要求就是左表大右表小,因为构建 Runtime Filter是需要承担计算成本的,包括一些内存的开销。
  2. 第二个要求就是左右表 Join 出来的结果很少,说明这个 Join 可以过滤掉左表的绝大部分数据。

Join Reorder

Join Reorder 是指在执行SQL查询时,决定多个表进行 join 的顺序。它是数据库查询优化的一个重要方面,对查询性能和效率有着重要的影响, 不同的 join order 对性能可能有数量级的影响。

从定义来看,其实就是寻找最短路径(最优解)的过程,因此可以从算法的角度考虑,比如动态规划算法与贪心算法;同时也可以基于规则来做。

Doris中Join Reorder的实现是基于规则策略的,其规则定义如下:

  1. 让大表、跟小表尽量做 Join,它生成的中间结果是尽可能小的。
  2. 把有条件的 Join 表往前放,也就是说尽量让有条件的 Join 表进行过滤
  3. Hash Join 的优先级高于 Nest Loop Join,因为 Hash join 本身是比 Nest Loop Join 快很多的。

Join Reorder 也是SQL查询引擎框架通用的一种优化手段, 在PolarDB、TiDB、StarRocks等数据库框架中都有涉及与应用。其实现与说明如下:

  1. TiDB Join Reorder 算法简介
  2. StarRocks Join Reorder 源码解析
  3. PolarDB-X 优化器核心技术 ~ Join Reorder

标签:Hash,Filter,右表,SQL,Join,数据,Doris,分布式
From: https://www.cnblogs.com/zhiyong-ITNote/p/17861747.html

相关文章

  • 无涯教程-MySQL String Functions函数
    Sr.No.Name&Description1ASCII()返回最左边字符的数值2BIN()返回参数的字符串表示形式3BIT_LENGTH()返回参数的长度(以位为单位)4CHAR_LENGTH()返回参数中的字符数5CHAR()返回传递的每个整数的字符6CHARACTER_LENGTH()CHAR_LENGTH()的同义词7......
  • 配置Oracle链接服务器使用分布式事务​
    1现象在SQLServer中创建指向Oracle的链接服务器,SQL语句在事务中向链接服务器插入数据。返回链接服务器无法启动分布式事务的报错。2解决在Windows平台下,SQLServer依赖分布式事务协调器(MSDTC)来使用分布式事务,OracleClient使用OracleServicesforMicrosoftTransactionServer......
  • 无涯教程-MySQL Numeric Functions函数
    MySQL数值函数主要用于数值运算和/或数学计算。下表详细介绍了MySQL实现中可用的数值函数。Sr.No.Name&Description1ABS()返回数值表达式的绝对值。2ACOS()返回数值表达式的反余弦值。如果该值不在-1到1之间,则返回NULL。3ASIN()返回数字表达式的反正弦值。如......
  • MySQL5.7到8.0的升级迁移!1分钟搞定MySQL多版本数据迁移
    在上个月,MySQL5.7正式结束了生命周期,即EOL(EndofLife),意味着Oracle将不再为MySQL5.7提供技术支持,包括Bug修复或安全漏洞,大大增加了使用数据库的风险。在全球关系型数据库市场中,MySQL市场份额最高,在MySQL各版本使用中,5.7仍占据大部分比例,其次是5.6和8.0。因此,此次MySQL5......
  • SQL Server Profiler基础使用
     一、简介一个图形界面工具,用于创建和管理跟踪并分析和重播跟踪结果 二、如何打开1、直接打开 2、MicrosoftSQLServerManagementStudio工具栏打开  三、配置跟踪如过滤出本机电脑执行的sql脚本 跟踪属性常规配置   找计算机名称  ......
  • mysql 报错which is not functionally dependent on columns in GROUP BY clause; thi
    Expression#2ofSELECTlistisnotinGROUPBYclauseandcontainsnonaggregatedcolumn'd.Id'whichisnotfunctionallydependentoncolumnsinGROUPBYclause;thisisincompatiblewithsql_mode=only_full_group_bywindow系统中,服务中找到mysql服务"......
  • Flask-SQLAlchemy flask-migrate mysql用法记录
    一、简介二、内容三、问题 一、简介Flask-SQLAlchemy是一个为Flask应用增加SQLAlchemy支持的扩展。它致力于简化在Flask中SQLAlchemy的使用。SQLAlchemy是目前python中最强大的ORM框架,功能全面,使用简单。ORM优缺点优点有语法提示,省去自己拼写SQL,保......
  • SQLServer字符串查找(判断字符串是否含中文,数字或字母),并把是否含中文作为条件来执行
    转载自:SQLServer字符串查找(判断字符串是否含中文,数字或字母),并把是否含中文作为条件来执行一些操作-亟待!-博客园(cnblogs.com)从sqlserver中提取数据如何截取字符1、LOCATE(substr,str):返回子串substr在字符串str中第一次出现的位置,如果字符substr在字符串str中不......
  • SQL Server2022安装图文教程
      一:下载 本次安装测试系统环境:    1、官网下载链接https://www.microsoft.com/zh-cn/sql-server/sql-server-downloadsSQLServer下载|Microsoft    2、在下载目录中找到下面这个小的安装包SQL2022-SSEI-Dev.exe,运行开始下载SQLserver;   二:安装SqlServer2022......
  • odigos 基于ebpf 以及OpenTelemetry 的分布式tracing 解决方案
    按照odigos官方的介绍是不需要进行代码的修改就可以实现方便的跨应用的分布式trace,目前支持java,python,net,go,js等语言目前看官方的介绍,安装是比较简单的(核心基于了k8s),目前官方文档比较清晰可以试用下说明目前开源分布式trace的工具是越来越多了,同时基于ebpf以及OpenTelemetry标......