Presto 之 explain and explain analyze的实现

一. 前言

      本文主要探索在Presto中Explain功能是如何实现的。在Presto中,Explain用法有两种,一种是单纯的explain,此场景只会显示经过RBO优化后的执行计划,但是查询并不会真正地执行。第二种是explain analyze,此场景会真正执行查询,而且打印出来的执行计划是真正运行的执行计划。不仅如此,explain analyze还包含各个stage的时间等,信息比单独的explain丰富。

二. Explain

        在Presto中,单独的explain会通过生成常量算子Value Operator来实现不执行Query只打印执行计划树的功能的。如下为其一个样例:

Presto 之 explain and explain analyze的实现_第1张图片

       将explain编译成ValueNode的实现在ExplainRewrite::visitExplain中完成的,如下为其核心的代码调用流程:

     ExplainRewrite::visitExplain

           getQueryPlan

                  singleValueQuery(plan) // plan为value值

                       Relation values = values(plan)  // 编译成常量,plan为value的输出 

三. Explain  Analyze

       与explain相比,explain analyze不仅会打印计划执行树,还会真实执行SQL和打印执行过程中的stage拆分等信息,如修所示:

Presto 之 explain and explain analyze的实现_第2张图片

     explain analyze在执行计划的过程中,计划执行树并不是生产常量Value的形式,而是生成了ExplainAnalyzeNode + queryPlan的形式,如下所示:

Presto 之 explain and explain analyze的实现_第3张图片

        也就是说,地下的query会真正地执行,并且将执行结果输送到ExplainAnalyzeOperator中,但是ExplainAnalyzeOperator会忽略上游传输过来的数据,而是会一直等上游执行完毕后,再根据queryInfo组装成DistributedPlan返回给下游的Operator,实现了既执行query,又只返回执行计划树的功能。

你可能感兴趣的:(presto,presto,trino,openlookeng,explain,大数据)