文章目录

  • 前言
  • 格式
    • Text/String
    • XML
    • JSON
    • DOT
  • 属性级别

前言

我们知道Calcite会将SQL为RelNode构成的执行计划,为了分析执行计划,经常会使用RelOptUtil.toString()将其转为字符串。其实,除了这种字符串之外还有更多的格式,可以展示执行计划:XML、JSON、DOT

格式

在SqlExplainFormat中可以看到这四种格式,其中TEXT其实和String一样

在RelOptUtilTest.java中构建一个单测,利用已有的relBuilder可以快速构建一个RelNode

RelNode aggregate =  relBuilder.scan("DEPT").aggregate(relBuilder.groupKey(),relBuilder.aggregateCall(SqlStdOperatorTable.COUNT)).limit(0, 10).build();

Text/String

    String strPlan = RelOptUtil.toString(aggregate);System.out.println(strPlan);String textPlan = RelOptUtil.dumpPlan("TEXT:",aggregate,SqlExplainFormat.TEXT,SqlExplainLevel.ALL_ATTRIBUTES);System.out.println(textPlan);

打印的结果有些差别,是因为SqlExplainLevel.ALL_ATTRIBUTES选择的是所有属性;toString只是EXPPLAN_ATTRIBUTES级别

LogicalSort(fetch=[10])LogicalAggregate(group=[{}], agg#0=[COUNT()])LogicalTableScan(table=[[scott, DEPT]])TEXT:
LogicalSort(fetch=[10]): rowcount = 1.0, cumulative cost = {6.125 rows, 21.0 cpu, 0.0 io}, id = 4LogicalAggregate(group=[{}], agg#0=[COUNT()]): rowcount = 1.0, cumulative cost = {5.125 rows, 5.0 cpu, 0.0 io}, id = 3LogicalTableScan(table=[[scott, DEPT]]): rowcount = 4.0, cumulative cost = {4.0 rows, 5.0 cpu, 0.0 io}, id = 2

XML

    String xmlPlan = RelOptUtil.dumpPlan("xml:",aggregate,SqlExplainFormat.XML,SqlExplainLevel.ALL_ATTRIBUTES);System.out.println(xmlPlan);

XML格式的,直观上看起来还不如Text了

<RelNode type="LogicalSort"><Property name="fetch">10</Property><Inputs><RelNode type="LogicalAggregate"><Property name="group">{}</Property><Property name="agg#0">COUNT()</Property><Inputs><RelNode type="LogicalTableScan"><Property name="table">[scott, DEPT]</Property><Inputs/></RelNode></Inputs></RelNode></Inputs>
</RelNode>

JSON

String jsonPlan = RelOptUtil.dumpPlan("json:",aggregate,SqlExplainFormat.JSON,SqlExplainLevel.ALL_ATTRIBUTES);
System.out.println(jsonPlan);

看起来也不是很方便,但是json格式便于传输


{"rels": [{"id": "0","relOp": "LogicalTableScan","table": ["scott","DEPT"],"inputs": []},{"id": "1","relOp": "LogicalAggregate","group": [],"aggs": [{"agg": {"name": "COUNT","kind": "COUNT","syntax": "FUNCTION_STAR"},"type": {"type": "BIGINT","nullable": false},"distinct": false,"operands": [],"name": null}]},{"id": "2","relOp": "LogicalSort","collation": [],"fetch": {"literal": 10,"type": {"type": "INTEGER","nullable": false}}}]
}

DOT

String dotPlan = RelOptUtil.dumpPlan("dot:",aggregate,SqlExplainFormat.DOT,SqlExplainLevel.ALL_ATTRIBUTES);
System.out.println(dotPlan);

这个主要是用于绘图,而不是直接观察计划

digraph {
"LogicalAggregate\ngroup = {}\nagg#0 = COUNT()\nrowcount = 1.0 cumul\native cost = {5.125 \nrows, 5.0 cpu, 0.0 i\no} id = 3" -> "LogicalSort\nfetch = 10\nrowcount = 1.0 cumul\native cost = {6.125 \nrows, 21.0 cpu, 0.0 \nio} id = 4" [label="0"]
"LogicalTableScan\ntable = [scott, DEPT\n]\nrowcount = 4.0 cumul\native cost = {4.0 ro\nws, 5.0 cpu, 0.0 io}\n id = 2" -> "LogicalAggregate\ngroup = {}\nagg#0 = COUNT()\nrowcount = 1.0 cumul\native cost = {5.125 \nrows, 5.0 cpu, 0.0 i\no} id = 3" [label="0"]
}

将plan保存plan.dot文件,然后使用graphviz的命令dot -Tsvg -o plan.svg plan.dot生成svg图片

也可以通过-T指定其他格式,如-Tpng

用浏览器可以直接打开生成的svg图

属性级别

刚刚提到SqlExplainLevel导致了TEXT和String的不一样,其实一共有5种级别

用上文的RelNode感受一下,这些plan的不同吧

noAttributes:
LogicalSortLogicalAggregateLogicalTableScanexpPlanAttributes:
LogicalSort(fetch=[10])LogicalAggregate(group=[{}], agg#0=[COUNT()])LogicalTableScan(table=[[scott, DEPT]])digestAttributes:
LogicalSort(fetch=[10])LogicalAggregate(group=[{}], agg#0=[COUNT()])LogicalTableScan(table=[[scott, DEPT]])nonCostAttributes:
LogicalSort(fetch=[10]), id = 4LogicalAggregate(group=[{}], agg#0=[COUNT()]), id = 3LogicalTableScan(table=[[scott, DEPT]]), id = 2allAttributes:
LogicalSort(fetch=[10]): rowcount = 1.0, cumulative cost = {6.125 rows, 21.0 cpu, 0.0 io}, id = 4LogicalAggregate(group=[{}], agg#0=[COUNT()]): rowcount = 1.0, cumulative cost = {5.125 rows, 5.0 cpu, 0.0 io}, id = 3LogicalTableScan(table=[[scott, DEPT]]): rowcount = 4.0, cumulative cost = {4.0 rows, 5.0 cpu, 0.0 io}, id = 2

Calcite执行计划的四种展示格式相关推荐

  1. Oracle查看执行计划的几种方法

    Oracle查看执行计划的几种方法 一般来说,有如下几种获取执行计划的方式: 1.AUTOTRACE方式 AUTOTRACE是Oracle自带的客户端工具SQL*Plus的一个特性.启用AUTOTRA ...

  2. Linux开机自动化执行脚本的四种方法(真实案例分享)

    Linux开机自动化执行脚本的四种方法(真实案例分享) 最近眼睛有点疼,可能是长时间面对电脑屏幕的原因罢.百度后安装了Redshift这款护眼工具,只要事先写好配置文件它会根据你的地理位置自动调节屏幕 ...

  3. Java创建并执行线程的四种方法

    Java创建并执行线程的四种方法 java里面创建线程有四种方式: 无返回: 实现Runnable接口,重写run(); 继承Thread类,重写run(); 有返回: 实现Callable接口,重写 ...

  4. oracle的解析計劃,Oracle中获取执行计划的几种方法分析

    1. 预估执行计划 - Explain PlanExplain plan以SQL语句作为输入,得到这条SQL语句的执行计划,并将执行计划输出存储到计划表中. 首先,在你要执行的SQL语句前加expla ...

  5. mysql执行计划extra_四、MySQL优化之explain执行计划的extra属性

    explain之extra 包含不适合在其他列中显示但十分重要的额外信息 using filesort:文件排序 表明MySQL会对数据使用一个外部的索引排序, 而不是按照表内的索引顺序读取, mys ...

  6. python 命令-Python中执行系统命令的四种方法

    一.os.system方法 在子终端运行系统命令,可以获取命令执行后的返回信息以及执行返回的状态.执行后返回两行结果,第一行是结果, 第二行是执行状态信息,如果命令成功执行,这条语句返回0,否则返回1 ...

  7. Python执行系统命令的四种方法

    一.os.system方法 在子终端运行系统命令,可以获取命令执行后的返回信息以及执行返回的状态.执行后返回两行结果,第一行是结果, 第二行是执行状态信息,如果命令成功执行,这条语句返回0,否则返回1 ...

  8. #千锋逆战班,Cq# 在千锋“逆战”学习第 20天,今天学了内部类的四种书写格式

    一.内部类 1.内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立. 2.在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类. 3.创建内部类 ...

  9. c# ThreadPool 判断子线程全部执行完毕的四种方法

    1.先来看看这个 多线程编程 多线程用于数据采集时,速度明显很快,下面是基本方法,把那个auto写成采集数据方法即可. using System; using System.Collections.G ...

最新文章

  1. python使用psutil获取系统(Windows Linux)所有运行进程信息实战:CPU时间、内存使用量、内存占用率、PID、名称、创建时间等;
  2. java拆解_深入拆解Java虚拟机视频教程
  3. 阿里云高级技术专家空见: CDN的数据化之路
  4. 7.Windows线程切换_时钟中断切换
  5. zabbix3.2.4监控MySQL5.7.16状态
  6. 工作56:element里面表单重置
  7. Hive分析窗口函数 NTILE,ROW_NUMBER,RANK,DENSE_RANK
  8. np生成多维数组数组比较
  9. 在datasnap 中使用unidac 访问数据(客户端)
  10. java当前类路径_Java取得当前类的路径
  11. amd显卡测试帧数显示软件,NVIDIA发布帧数显示及显卡基准测试应用FrameView
  12. 微软官方Windows_Hello生物识别驱动设计指南
  13. 使用STM32CubeProgrammer烧录STM32芯片
  14. 又拍云叶靖:OpenResty 在又拍云存储中的应用
  15. 日常英语---九、MapleStory Link Skills Guide
  16. 2021年高级维修电工证考试题库,职业技能鉴定职业资格
  17. ABP入门系列之1——ABP总体介绍
  18. python重要知识点_35个高级Python知识点总结
  19. 韩顺平 2021零基础学Java 学习笔记
  20. 摘:戒嗔小和尚的博客一

热门文章

  1. XILINX DMA/Bridge Subsystem for PCI Express (XDMA)笔记1(基于VU250 board)
  2. 最新计算机毕业设计选题推荐 - 毕设选题建议
  3. 【视频】老外拍的阿里巴巴纪录片,讲述淘宝怎么打败eBay
  4. HTML李峋同款爱心代码源码分享,手机网页爱心代码源码
  5. Java详解:java对象转json字符串不加引号
  6. java awt canvas_JAVA.AWT.CANVAS使用
  7. 学计算机用酷一点的话怎么说,酷到让你窒息的句子说说简短一句话 很酷很拽的社会人专属说说...
  8. 计算机专业考计量经济学,计量经济学期末考试题库(完整版)及答案()(47页)-原创力文档...
  9. 奇偶数判断(YZOJ-1032)
  10. 传奇世界开服教程:传奇世界开服需要准备什么?前期需要投入多少?