ClickHouse与opt相关内容
Sumary
最近想要学习一下优化器,但是发现脱离项目学,看完了那些文章还是有一种纸上谈兵的感觉,虽然也看了部分ORCA的源码,但对GP不熟,ORCA看着也是云里雾里的。因为工作中处理最多的就是clickhouse了,于是就拿它下手。
正好github的clickhouse 2022 roadmap有这么一个东西。我就在想是不是可以引入一个CBO,不过引入CBO的工作量十分大。优化器比较重要的一个部分就是Join Order的优化了,但是CH这方面确实是一个弱项。
就想找个机会批判学习一下它。
先来看一下具体的sql的执行流程,大约就是图上的样子, Clickhouse的所有优化都是在TreeRewriter里做的。。。。
clickhouse的优化都是在InterpreterSelectQuery的构造函数里做的。 大概的调用的函数就包括下面几个:
- 把多个join重写了,其实就是 join改写成了多个subquery,没有join order的修改。
- 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);
...
}