ClickHouse中JOIN算法选择逻辑以及auto选项

ClickHouse中JOIN算法选择逻辑以及auto选项

ClickHouse中的JOIN的算法有6种:

  1. Direct;
  2. Partial merge;
  3. Hash;
  4. Grace hash;
  5. Full sorting merge;
    1. Parallel hash。

Setting配置join_algorithm用于指定JOIN算法,它可以设置为多个值,例如join_algorithm=‘direct,hash,partial_merge’。在选择最终JOIN算法的时候是根据setting配置join_algorithm, 以及JOIN操作的Strictness、Kind和参与JOIN的右表表引擎类型共同决定。
Setting配置join_algorithm的可选值(可以组合,前面的例子已经展示了)如下所示:

  1. default
  2. auto
  3. hash
  4. partial_merge
  5. prefer_partial_merge
  6. parallel_hash
  7. direct
  8. full_sorting_merge
  9. grace_hash

JOIN算法的选择逻辑

上面已经提到join_algorithm上可以指定多个值,相当于是一个多路开关,它规定了哪些JOIN算法可以使用。而在具体JOIN语句执行时则根据具体情况(例如Strictness、Kind和右表表引擎类型)选择合适的JOIN算法。如果没有合适的JOIN算法,则会报错。选择逻辑按照优先级从高往低列举如下:

  1. 如果setting join_algorithm 包含’direct’或’default’,则优先尝试Direct join。Direct join的使用条件是:

    Strictness Kind 右表引擎 JOIN关键字/条件
    ANY LEFT 键值对表引擎,如
    Join engine、Dictionary engine
    必须为Join表引擎的关键字
    单连接条件(不带OR)
  2. 如果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)
  3. 如果setting join_algorithm 包含’parallel_hash’,则尝试使用Parallel hash join。Parallel hash join的使用条件是:

    Strictness Kind 右表引擎 JOIN关键字/条件
    除了ASOF的所有 INNER
    LEFT
    - 单连接条件(不带OR)
  4. 如果setting join_algorithm 包含’hash’或’default’,或者虽然包含’parallel_hash’或’prefer_partial_merge’但是前面对应使用条件不满足,则尝试使用Hash join。Hash join的使用条件是:

    Strictness Kind 右表引擎 JOIN关键字/条件
    所有 所有 - -
  5. 如果setting join_algorithm 包含’full_sorting_merge’,则尝试使用Full sorting merge join。Full sorting merge join的使用条件是:

    Strictness Kind 右表引擎 JOIN关键字/条件
    ALL | ANY INNER
    LEFT
    RIGHT
    FULL
    - 单连接条件(不带OR)
  6. 如果setting join_algorithm 包含’grace_hash’,则尝试使用Grace hash join。Grace hash join的使用条件是:

    Strictness Kind 右表引擎 JOIN关键字/条件
    除了ASOF的所有 INNER
    LEFT
    RIGHT
    FULL
    单连接条件(不带OR)
  7. 如果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_joinmax_bytes_in_join设定。

设置join_overflow_mode

join_algorithm为’hash’时,在阈值max_rows_in_joinmax_bytes_in_join被超过时的行为取决于join_overflow_mode的设定。join_overflow_mode有两种取值:

  1. THROW

    抛异常。

  2. BREAK

    中断执行,返回部分结果。

相关推荐

  1. ClickHouseJOIN算法选择逻辑以及auto选项

    2024-01-12 21:40:03       47 阅读
  2. 【Spark精讲】SparkSQL Join选择逻辑

    2024-01-12 21:40:03       41 阅读
  3. JeecgBoot-vue3--JDictSelectTag去掉选项得‘请选择

    2024-01-12 21:40:03       54 阅读
  4. JenKins 的new Item各个选项应该怎选择

    2024-01-12 21:40:03       41 阅读
  5. 《程序员的选择逻辑与思考》

    2024-01-12 21:40:03       30 阅读
  6. 算法选择排序

    2024-01-12 21:40:03       49 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-12 21:40:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-12 21:40:03       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-12 21:40:03       82 阅读
  4. Python语言-面向对象

    2024-01-12 21:40:03       91 阅读

热门阅读

  1. python之异常与日志

    2024-01-12 21:40:03       56 阅读
  2. 职工工作量统计(课程设计)

    2024-01-12 21:40:03       47 阅读
  3. Go语言中Print Printf Println的区别

    2024-01-12 21:40:03       54 阅读
  4. SQL语句

    SQL语句

    2024-01-12 21:40:03      52 阅读
  5. 在vue中使用v-for遍历arco.design图标

    2024-01-12 21:40:03       58 阅读
  6. ant-design-vue的table组件的自定义表头和表格内容

    2024-01-12 21:40:03       55 阅读
  7. flask web学习之模板(二)

    2024-01-12 21:40:03       60 阅读
  8. 原型和原型链

    2024-01-12 21:40:03       53 阅读
  9. [渗透测试学习] Crocodile - HackTheBox

    2024-01-12 21:40:03       55 阅读
  10. linux 安装redis

    2024-01-12 21:40:03       52 阅读
  11. [DM8] 查看当前执行的查询并杀死

    2024-01-12 21:40:03       62 阅读
  12. Postman应用打开超级慢解决办法

    2024-01-12 21:40:03       52 阅读