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 ...
随机推荐
- 关于wake on lan远程唤醒主机的问题,长时间关机无法远程唤醒
英特尔在年初发布了几款低功耗的CPU,国内厂商在迷你主机领域纷纷搭载新款CPU,卖的火爆.之前关注过迷你主机这块,于是,我也入手一个迷你主机玩玩,买的是板载N100的迷你主机.使用过程中会涉及到如何远 ...
- 个人理解strcpy
char * strcpy(char *dst,const char *src) { if((dst==NULL)||(src==NULL)) return NULL; char *ret = dst ...
- Python面向对象——封装
文章目录 内容回顾 封装 为何要隐藏? 作业 内容回顾 上节课复习: 1.编程范式/思想 面向过程 介绍: 核心是"过程"二字 过程就是"流水线" 过程终极奥义 ...
- 我看懂了oracle中pivot行转列的用法
我看懂了PIVOT的用法 用法Select * From 表名,PIVOT( SUM('要合并的列1'),MAX('要合并的列2'),....FOR 将值转换成列的列名 IN(列名1,列名2,列名3 ...
- 在 Rust 中实现 Repository 仓储模式
前言 单位上有个 Rust 项目,orm 选型很长时间都没定下来,故先设计了抽象的仓储层方便写业务逻辑. 设计抽象接口 抽象只读接口,仅读取使用,目前需求仅用查询 id.查询全部和按名称搜索,当然理应 ...
- C#学习笔记--逻辑语句(分支和循环)
逻辑语句 条件分支语句 条件分支语句可以让顺序执行的代码逻辑产生分支,满足对应条件地执行对应代码逻辑. IF语句 //IF语句块 int a=5; if(a>0&&a<15 ...
- 4款.NET开源的Redis客户端驱动库
前言 今天给大家推荐4款.NET开源免费的Redis客户端驱动库(以下排名不分先后). Redis是什么? Redis全称是REmote DIctionary Service,即远程字典服务.Redi ...
- 普冉PY32系列(九) GPIO模拟和硬件SPI方式驱动无线收发芯片XL2400
目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...
- jq工具及其常用用法
近来在工作中处理JSON处理较多,深入研究了一下jq,之前对jq的使用一直停留在JSON数据格式化的层面,实际它的能力远不止于此. 在处理JSON数据时,我们经常需要在命令行中进行过滤.查询和编辑的操 ...
- 联想think服务器centos系统安装
一.前言 本以为安装服务器是一件轻松顺利的事,没想到一安就是两天- 二.错误列表 1.硬件系统不兼容低版本centos 刚开始安装centos6.8的操作系统总是无法找到配置好的raid阵列导致无法安 ...