ClickHouse与opt相关内容

Sumary

最近想要学习一下优化器,但是发现脱离项目学,看完了那些文章还是有一种纸上谈兵的感觉,虽然也看了部分ORCA的源码,但对GP不熟,ORCA看着也是云里雾里的。因为工作中处理最多的就是clickhouse了,于是就拿它下手。 正好github的clickhouse 2022 roadmap有这么一个东西。我就在想是不是可以引入一个CBO,不过引入CBO的工作量十分大。优化器比较重要的一个部分就是Join Order的优化了,但是CH这方面确实是一个弱项。 就想找个机会批判学习一下它。

sql 先来看一下具体的sql的执行流程,大约就是图上的样子, Clickhouse的所有优化都是在TreeRewriter里做的。。。。

clickhouse的优化都是在InterpreterSelectQuery的构造函数里做的。 大概的调用的函数就包括下面几个:

  1. 把多个join重写了,其实就是 join改写成了多个subquery,没有join order的修改。
  2. analyze里做一些push down 之类的操作,以及去除一些不需要的列等操作,基本就是一个简单的RBO。 本来还以为有什可以研究一下的,算了。还是去搞ORCA吧。
InterpreterSelectQuery::InterpreterSelectQuery(...){
        rewriteMultipleJoins(query_ptr, joined_tables.tablesWithColumns(), context->getCurrentDatabase(), context->getSettingsRef());
        ...
    auto analyze = [&] (bool try_move_to_prewhere)
    {
        syntax_analyzer_result = TreeRewriter(context).analyzeSelect(...)
        if (try_move_to_prewhere && storage && query.where() && !query.prewhere())
        query_analyzer = std::make_unique<SelectQueryExpressionAnalyzer>(...)

    }
    analyze(settings.optimize_move_to_prewhere);
    ...

}