开发者社区> 问答> 正文

LM计算引擎执行计划分析



7.1 使用执行计划


在进行一个业务SQL的性能调优,或是查看一个业务SQL的计算成本消耗时,使用explain命令来进行查看是一个很好的选择。iDB Cloud for 分析型数据库中提供图形化的执行计划命令,同时,用户也可以手动使用explain指令进行查看。

explain 语句


分析型数据库支持通过explain语句来查看逻辑计划和物理执行计划,当用户发起一个explain查询到分析型数据库系统后,分析型数据库会抽样一个数据分区来分析执行计划,并以图形方式展现给用户。
explain语句的格式为, explain + select语句, 例如:


  • 简单sql的explain<PRE prettyprinted? linenums>
    1.   explain select count(*) from test4dmp.test where id > 0

  • 复杂sql的explain<PRE prettyprinted? linenums>
    1. explain
    2. select student.id, count(*)
    3. from test4dmp.student
    4. inner join test4dmp.grade on student.id =grade.sid
    5. inner join test4dmp.elective on elective.id=student.id
    6. group by student.id
    7. having count(*) > 2
    8. order by student.id
    9. limit 10


返回文本格式


当用户通过查询的方式,想要获取文本格式的explain语句后,将会得到如下的json串:
  • 返回的json格式<PRE prettyprinted? linenums>
    1.   | EXPLAIN       |
    2.   | logical json  |
    3.   | physical json |

  • 返回格式说明一共会返回2行1列并且列名为EXPLAIN的ResultSet记录。其中第一行为逻辑计划,第二行为物理计划。

  • JSON格式说明Node 代表着唯一的子节点
  • LeftNode 代表左子树
  • RightNode 代表右子树
  • MiddleNode 代表所有的中间子树(多叉执行树), 可以有多个MiddleNode
  • 其余key-value对统一在同层级的Node和*Node节点显示


Explain 逻辑计划详细语义


  • 样例sql<PRE prettyprinted? linenums>
    1. explain
    2. select student.id, count(*)
    3. from test4dmp.student
    4. inner join test4dmp.grade on student.id =grade.sid
    5. inner join test4dmp.elective on elective.id=student.id
    6. group by student.id
    7. having count(*) > 2
    8. order by student.id
    9. limit 10

  • 逻辑计划的explain string<PRE prettyprinted? linenums>
    1. {
    2.      "Items": ["student.id", "COUNT(*)"],
    3.      "Name": "SelectNode",
    4.      "Node": {
    5.          "Having": "COUNT(*) > 2",
    6.          "Items": ["student.id"],
    7.          "Name": "GroupNode",
    8.          "Node": {
    9.              "Items": ["student.id"],
    10.              "Name": "OrderByNode",
    11.              "Node": {
    12.                  "Name": "JoinNode",
    13.                  "LeftNode": {
    14.                      "Name": "JoinNode",
    15.                      "LeftNode": {
    16.                          "Name": "TableNode",
    17.                          "Schema": ["ID"],
    18.                          "TableName": "STUDENT__1"
    19.                      },
    20.                      "OnCondition": "student.id = grade.sid",
    21.                      "RightNode": {
    22.                          "Name": "TableNode",
    23.                          "Schema": ["SID"],
    24.                          "TableName": "GRADE__9"
    25.                      }
    26.                  },
    27.                  "OnCondition": "elective.id = student.id",
    28.                  "RightNode": {
    29.                      "Name": "TableNode",
    30.                      "Schema": ["ID"],
    31.                      "TableName": "ELECTIVE__1"
    32.                  }
    33.              }
    34.          }
    35.      },
    36.      "Limit:": "LIMIT 100"
    37. }

  • 逻辑计划explain string的图形化展示效果:
  • 逻辑计划各个节点说明:SelectNode表示这select中最终输出表达式的相关信息, 例如select要输出的表达式集合
  • GroupNode表示GroupBy语句的相关信息,例如groupby的列,having的表达式等
  • OrderByNode表示OrderBy的列信息,例如列名,顺序等。
  • JoinNode表示逻辑Join树的信息,例如join的on条件
  • TableNode表示分区表的信息,例如参与计算的列,表名等。


Explain 物理执行计划详细语义


  • 样例sql<PRE prettyprinted? linenums>
    1. explain
    2. select student.id, count(*)
    3. from test4dmp.student
    4. inner join test4dmp.grade on student.id =grade.sid
    5. inner join test4dmp.elective on elective.id=student.id
    6. group by student.id
    7. having count(*) > 2
    8. order by student.id
    9. limit 10

  • 物理计划的explain string<PRE prettyprinted? linenums>
    1. {
    2.      "Name": "JoinExecutor",
    3.      "isDimension": "false",
    4.      "LeftNode": {
    5.          "Name": "TableExecutor",
    6.          "PresortCondition": "null",
    7.          "SecpartCondition": "null",
    8.          "QueryColumns": "ID, BOOLEAN_TEST, LONG_TEST",
    9.          "FilterCondition": "null",
    10.          "ResultRows": 0,
    11.          "PartColumn": "ID",
    12.          "IsDimension": "false",
    13.          "TableName": "TEST__2",
    14.          "QueryCondition": "(ID = 0)"
    15.      },
    16.      "JoinCondition": "TEST__2.ID=TEST__2.ID",
    17.      "RightNode": {
    18.          "Name": "TableExecutor",
    19.          "PresortCondition": "null",
    20.          "SecpartCondition": "null",
    21.          "QueryColumns": "ID, BOOLEAN_TEST",
    22.          "FilterCondition": "null",
    23.          "ResultRows": 0,
    24.          "PartColumn": "ID",
    25.          "IsDimension": "false",
    26.          "TableName": "TEST__2",
    27.          "QueryCondition": "((INT_TEST < 0) AND (ID = 0))"
    28.      },
    29.      "JoinType": "innerJoin",
    30.      "WhereFilter": "(BOOLEAN_TEST = BOOLEAN_TEST)",
    31.      "OnFilter": "null"
    32. }

  • 物理计划explain string的图形化展示效果:
  • 物理计划各个节点说明:JoinExecutor表示Join的节点JoinCondition:join的条件
  • JoinType:join的类型,innerJoin, leftJoin, rightJoin, simiJoin等
  • OnFilter: on上面的过滤条件
  • WhereFilter: where里面的过滤条件(只有leftjoin中on和where的条件才有差异)
  • IsDimension:该Join子树中是否含有维度表
TableExecutor表示参与计算的表信息
  • FilterCondition: 该表参与过滤计算的表达上(不能下沉索引的表达式)
  • IsDimension:该表是否是维度表
  • PartColumn:一级分区列
  • SecPartColumn:二级分区列
  • QueryColumns: 参与计算的列数(下沉索引计算的列不包含在此之内)
  • QueryCondition: 索引条件
  • ResultRows: 该节点预估cost
  • PresortCondition: 预排序条件,可以用做优先索引条件下沉
  • SecpartCondition:二级分区筛选条件,可以用做二级分区筛选。
  • TableName: 分区表名

展开
收起
nicenelly 2017-10-26 15:40:38 2229 0
0 条回答
写回答
取消 提交回答
问答排行榜
最热
最新

相关电子书

更多
MaxCompute SQL计算成本调优以及优化方法 立即下载
时序数据库TSDB新功能 - 如何用SQL进行时序查询 立即下载
MySQL查询优化实战 立即下载