Calcite执行计划的四种展示格式
文章目录
- 前言
- 格式
- 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执行计划的四种展示格式相关推荐
- Oracle查看执行计划的几种方法
Oracle查看执行计划的几种方法 一般来说,有如下几种获取执行计划的方式: 1.AUTOTRACE方式 AUTOTRACE是Oracle自带的客户端工具SQL*Plus的一个特性.启用AUTOTRA ...
- Linux开机自动化执行脚本的四种方法(真实案例分享)
Linux开机自动化执行脚本的四种方法(真实案例分享) 最近眼睛有点疼,可能是长时间面对电脑屏幕的原因罢.百度后安装了Redshift这款护眼工具,只要事先写好配置文件它会根据你的地理位置自动调节屏幕 ...
- Java创建并执行线程的四种方法
Java创建并执行线程的四种方法 java里面创建线程有四种方式: 无返回: 实现Runnable接口,重写run(); 继承Thread类,重写run(); 有返回: 实现Callable接口,重写 ...
- oracle的解析計劃,Oracle中获取执行计划的几种方法分析
1. 预估执行计划 - Explain PlanExplain plan以SQL语句作为输入,得到这条SQL语句的执行计划,并将执行计划输出存储到计划表中. 首先,在你要执行的SQL语句前加expla ...
- mysql执行计划extra_四、MySQL优化之explain执行计划的extra属性
explain之extra 包含不适合在其他列中显示但十分重要的额外信息 using filesort:文件排序 表明MySQL会对数据使用一个外部的索引排序, 而不是按照表内的索引顺序读取, mys ...
- python 命令-Python中执行系统命令的四种方法
一.os.system方法 在子终端运行系统命令,可以获取命令执行后的返回信息以及执行返回的状态.执行后返回两行结果,第一行是结果, 第二行是执行状态信息,如果命令成功执行,这条语句返回0,否则返回1 ...
- Python执行系统命令的四种方法
一.os.system方法 在子终端运行系统命令,可以获取命令执行后的返回信息以及执行返回的状态.执行后返回两行结果,第一行是结果, 第二行是执行状态信息,如果命令成功执行,这条语句返回0,否则返回1 ...
- #千锋逆战班,Cq# 在千锋“逆战”学习第 20天,今天学了内部类的四种书写格式
一.内部类 1.内部类可以用多个实例,每个实例都有自己的状态信息,并且与其他外围对象的信息相互独立. 2.在单个外围类中,可以让多个内部类以不同的方式实现同一个接口,或者继承同一个类. 3.创建内部类 ...
- c# ThreadPool 判断子线程全部执行完毕的四种方法
1.先来看看这个 多线程编程 多线程用于数据采集时,速度明显很快,下面是基本方法,把那个auto写成采集数据方法即可. using System; using System.Collections.G ...
最新文章
- python使用psutil获取系统(Windows Linux)所有运行进程信息实战:CPU时间、内存使用量、内存占用率、PID、名称、创建时间等;
- java拆解_深入拆解Java虚拟机视频教程
- 阿里云高级技术专家空见: CDN的数据化之路
- 7.Windows线程切换_时钟中断切换
- zabbix3.2.4监控MySQL5.7.16状态
- 工作56:element里面表单重置
- Hive分析窗口函数 NTILE,ROW_NUMBER,RANK,DENSE_RANK
- np生成多维数组数组比较
- 在datasnap 中使用unidac 访问数据(客户端)
- java当前类路径_Java取得当前类的路径
- amd显卡测试帧数显示软件,NVIDIA发布帧数显示及显卡基准测试应用FrameView
- 微软官方Windows_Hello生物识别驱动设计指南
- 使用STM32CubeProgrammer烧录STM32芯片
- 又拍云叶靖:OpenResty 在又拍云存储中的应用
- 日常英语---九、MapleStory Link Skills Guide
- 2021年高级维修电工证考试题库,职业技能鉴定职业资格
- ABP入门系列之1——ABP总体介绍
- python重要知识点_35个高级Python知识点总结
- 韩顺平 2021零基础学Java 学习笔记
- 摘:戒嗔小和尚的博客一
热门文章
- XILINX DMA/Bridge Subsystem for PCI Express (XDMA)笔记1(基于VU250 board)
- 最新计算机毕业设计选题推荐 - 毕设选题建议
- 【视频】老外拍的阿里巴巴纪录片,讲述淘宝怎么打败eBay
- HTML李峋同款爱心代码源码分享,手机网页爱心代码源码
- Java详解:java对象转json字符串不加引号
- java awt canvas_JAVA.AWT.CANVAS使用
- 学计算机用酷一点的话怎么说,酷到让你窒息的句子说说简短一句话 很酷很拽的社会人专属说说...
- 计算机专业考计量经济学,计量经济学期末考试题库(完整版)及答案()(47页)-原创力文档...
- 奇偶数判断(YZOJ-1032)
- 传奇世界开服教程:传奇世界开服需要准备什么?前期需要投入多少?