ClickHouse的JOIN算法选择逻辑以及auto选项
ClickHouse的JOIN算法选择逻辑以及auto选项
ClickHouse中的JOIN的算法有6种:
- Direct;
- Partial merge;
- Hash;
- Grace hash;
- Full sorting merge;
- Parallel hash。
Setting配置join_algorithm用于指定JOIN算法,它可以设置为多个值,例如join_algorithm='direct,hash,partial_merge'。在选择最终JOIN算法的时候是根据setting配置join_algorithm, 以及JOIN操作的Strictness、Kind和参与JOIN的右表表引擎类型共同决定。
Setting配置join_algorithm的可选值(可以组合,前面的例子已经展示了)如下所示:
- default
- auto
- hash
- partial_merge
- prefer_partial_merge
- parallel_hash
- direct
- full_sorting_merge
- grace_hash
JOIN算法的选择逻辑
上面已经提到join_algorithm上可以指定多个值,相当于是一个多路开关,它规定了哪些JOIN算法可以使用。而在具体JOIN语句执行时则根据具体情况(例如Strictness、Kind和右表表引擎类型)选择合适的JOIN算法。如果没有合适的JOIN算法,则会报错。选择逻辑按照优先级从高往低列举如下:
如果setting
join_algorithm包含'direct'或'default',则优先尝试Direct join。Direct join的使用条件是:Strictness Kind 右表引擎 JOIN关键字/条件 ANY LEFT 键值对表引擎,如
Join engine、Dictionary engine必须为Join表引擎的关键字
单连接条件(不带OR)如果setting
join_algorithm包含'partial_merge'或者'prefer_partial_merge',则尝试使用Partial(sorting) merge join。Partial(sorting) merge join的使用条件是:Strictness Kind 右表引擎 JOIN关键字/条件 ALL INNER
LEFT
RIGHT
FULL- 单连接条件(不带OR) ANY | SEMI INNER
LEFT- 连接条件(不带OR) 如果setting
join_algorithm包含'parallel_hash',则尝试使用Parallel hash join。Parallel hash join的使用条件是:Strictness Kind 右表引擎 JOIN关键字/条件 除了ASOF的所有 INNER
LEFT- 单连接条件(不带OR) 如果setting
join_algorithm包含'hash'或'default',或者虽然包含'parallel_hash'或'prefer_partial_merge'但是前面对应使用条件不满足,则尝试使用Hash join。Hash join的使用条件是:Strictness Kind 右表引擎 JOIN关键字/条件 所有 所有 - - 如果setting
join_algorithm包含'full_sorting_merge',则尝试使用Full sorting merge join。Full sorting merge join的使用条件是:Strictness Kind 右表引擎 JOIN关键字/条件 ALL | ANY INNER
LEFT
RIGHT
FULL- 单连接条件(不带OR) 如果setting
join_algorithm包含'grace_hash',则尝试使用Grace hash join。Grace hash join的使用条件是:Strictness Kind 右表引擎 JOIN关键字/条件 除了ASOF的所有 INNER
LEFT
RIGHT
FULL单连接条件(不带OR) 如果setting
join_algorithm包含'auto',则尝试先使用Hash join。当切换条件触发且Partial merge join的使用条件满足时切换到Partial merge join。
Auto的逻辑
当join_algorithm设置为'auto'时,ClickHouse会自行(不一定算是很智能)根据内存消耗情况选择JOIN算法。
首先采用hash join,并在JOIN运算期间记录生成的哈希表的行数和所消耗的内存。当行数或者消耗内存大小达到阈值时,切换到partial merge join算法。
阈值由settings设置max_rows_in_join 和max_bytes_in_join设定。
设置join_overflow_mode
当join_algorithm为'hash'时,在阈值max_rows_in_join 和max_bytes_in_join被超过时的行为取决于join_overflow_mode的设定。join_overflow_mode有两种取值:
THROW
抛异常。
BREAK
中断执行,返回部分结果。
ClickHouse的JOIN算法选择逻辑以及auto选项的更多相关文章
- MySQL Nested-Loop Join算法学习
不知不觉的玩了两年多的MySQL,发现很多人都说MySQL对比Oracle来说,优化器做的比较差,其实某种程度上来说确实是这样,但是毕竟MySQL才到5.7版本,Oracle都已经发展到12c了,今天 ...
- 1110Nested Loop Join算法
转自 http://blog.csdn.net/tonyxf121/article/details/7796657 join的实现原理 join的实现是采用Nested Loop Join算法,就是通 ...
- 关于join算法的四篇文章
MySQL Join算法与调优白皮书(一) MySQL Join算法与调优白皮书(二) MySQL Join算法与调优白皮书(三) MySQL Join算法与调优白皮书(四) MariaDB Join ...
- HASH JOIN算法
哈希连接(HASH JOIN) 前文提到,嵌套循环只适合输出少量结果集.如果要返回大量结果集(比如返回100W数据),根据嵌套循环算法,被驱动表会扫描100W次,显然这是不对的.看到这里你应该明白为 ...
- SparkMLlib学习分类算法之逻辑回归算法
SparkMLlib学习分类算法之逻辑回归算法 (一),逻辑回归算法的概念(参考网址:http://blog.csdn.net/sinat_33761963/article/details/51693 ...
- 24.join算法/锁_1
一. JOIN算法1.1. JOIN 语法 mysql> select * from t4; +---+------+ | a | b | +---+------+ | | 11 | | | 5 ...
- 谷歌大规模机器学习:模型训练、特征工程和算法选择 (32PPT下载)
本文转自:http://mp.weixin.qq.com/s/Xe3g2OSkE3BpIC2wdt5J-A 谷歌大规模机器学习:模型训练.特征工程和算法选择 (32PPT下载) 2017-01-26 ...
- MySQL Join算法与调优白皮书(二)
Index Nested-Loop Join (接上篇)由于访问的是辅助索引,如果查询需要访问聚集索引上的列,那么必要需要进行回表取数据,看似每条记录只是多了一次回表操作,但这才是INLJ算法最大 ...
- 022:SQL优化--JOIN算法
目录 一. SQL优化--JOIN算法 1.1. JOIN 写法对比 2. JOIN的成本 3. JOIN算法 3.1. simple nested loop join 3.2. index nest ...
- SparkMLlib分类算法之逻辑回归算法
SparkMLlib分类算法之逻辑回归算法 (一),逻辑回归算法的概念(参考网址:http://blog.csdn.net/sinat_33761963/article/details/5169383 ...
随机推荐
- Oracle查询--增加--删除--修改主键
对Oracle表主键的操作,有四类:查询,增加,修改,删除 1.查询主键 /*查询某个表中存在的约束*/ select * from user_constraints where table_name ...
- Apifox调用文件下载或Excel导出接口
点发送下面这个发送并下载就行了,,,,,在网上搜了一下午愣是没看到,,,,,,
- Required request body is missing缺失请求体
今天在写项目的时候前台传的参数后台一直接收不到,在网上搜了一些东西试了也没效果.后来发现是因为加了@RequestBody 去掉之后再次尝试就可以了.
- 【v2v迁移】Xen2kvm 迁移-linux篇
迁移环境: 源平台:华为FusionComputeV100R006C10SPC101 目标平台:基于KVM虚拟化的云平台,本文以原生的libvirt为例 虚拟机:centos 7.6 具体操作步骤: ...
- svn的常规使用
svn的常规使用 svn的常规使用 1 客户端 2 svn server 3 qt使用svn 4 svn项目迁移 Ubuntu上使用svn 1 安装 2 使用 svn的常规使用 1 客户端 下载地址: ...
- JAVA 类显式加载
类显式加载 1.Class.forName("classloader.Dog"); 方式加载 Example1 1 package classloader; 2 3 publ ...
- JavaScript 简介与引用
作者:WangMin 格言:努力做好自己喜欢的每一件事 我们通常写好的HTML网页是处于一个静态的效果,在用户体验这一方面就不是很好,给人一种死板的感觉.这里我们就可以用到JavaScript来为网页 ...
- Ubuntu 20.04 使用 socat 转发特定端口
安装socat apt install socat 根据需求确定要转发的端口 比如,我的需求是监听IPv6的某一TCP端口,并转发至局域网内某一特定主机,可以使用以下命令: socat TCP6-LI ...
- Grok AI 是什么?
原文链接:https://openaigptguide.com/grok-ai/ Grok AI是由马斯克推出的一款高级别的人工智能大语言模型,旨在帮助软件开发者以不同的口头语言交流和表达.它是基于多 ...
- 在路上---学习篇(一)Python 数据结构和算法 (2) -- 冒泡排序、选择排序、插入排序
独白: 第一次接触算法排序, 充满了好奇并且渴望了解其中原理,今天先学习了三种排序的方法,分别是 冒泡排序.选择排序.插入排序.学完以后发现数学知识真的很重要,越牛逼的算法要求知识越多,越精.虽说刚接 ...