SELECT 子句决定了一次查询语句最终返回哪些列字段或表达式。与直观的感受不同,虽然 SELECT 位于 SQL 语句的起始位置,但它却是在上述一众子句之后执行的。在其他子句执行之后, SELECT会将选取的字段或表达式作用于每行数据之上。
为了能够优化 JOIN 查询性能,首先 应该遵循左大右小的原则 ,即将数据量小的表放在右侧。这是因为在执行 JOIN 查询时,无论使用的是哪种连接方式,右表都会被全部加载到内存中与左表进行比较。其次, JOIN 查询目前没有缓存的支持 ,这意味着每一次 JOIN 查询,即便是连续执行相同的 SQL ,也都会生成一次全新的执行计划。如果应用程序会大量使用 JOIN 查询,则需要进一步考虑借助上层应用侧的缓存服务或使用 JOIN 表引擎来改善性能。最后, 如果是在大量维度属性补全的查询场景中,则建议使用字典代替 JOIN 查询 。因为在进行多表的连接查询时,查询会转换成两两连接的形式,这种 “ 滚雪球 ” 式的查询很可能带来性能问题。
默认情况下,ClickHouse使用 哈希联接 算法。 ClickHouse采取
并在RAM中为其创建哈希表。 在某个内存消耗阈值之后,ClickHouse回退到合并联接算法。
如果需要限制联接操作内存消耗,请使用以下设置:
当任何这些限制达到,ClickHouse作为 join_overflow_mode 设置指示。