閱讀51 返回首頁    go 小米MIX


7.1 使用執行計劃調優__第七章 性能優化和診斷_使用手冊_分析型數據庫-阿裏雲

在進行一個業務SQL的性能調優,或是查看一個業務SQL的計算成本消耗時,使用explain命令來進行查看是一個很好的選擇。iDB Cloud for 分析型數據庫中提供圖形化的執行計劃命令,同時,用戶也可以手動使用explain指令進行查看。

explain 語句

分析型數據庫支持通過explain語句來查看邏輯計劃和物理執行計劃,當用戶發起一個explain查詢到分析型數據庫係統後,分析型數據庫會抽樣一個數據分區來分析執行計劃,並以圖形方式展現給用戶。

explain語句的格式為, explain + select語句, 例如:

  • 簡單sql的explain

      explain select count(*) from test4dmp.test where id > 0
    
  • 複雜sql的explain

     explain 
     select student.id, count(*)
     from test4dmp.student 
     inner join test4dmp.grade on student.id =grade.sid 
     inner join test4dmp.elective on elective.id=student.id 
     group by student.id
     having count(*) > 2
     order by student.id 
     limit 10
    

返回文本格式

當用戶通過查詢的方式,想要獲取文本格式的explain語句後,將會得到如下的json串:

  • 返回的json格式
      | EXPLAIN       |
      | logical json  |
      | physical json |
    
  • 返回格式說明 一共會返回2行1列並且列名為EXPLAIN的ResultSet記錄。其中第一行為邏輯計劃,第二行為物理計劃。

  • JSON格式說明

    • Node 代表著唯一的子節點
    • LeftNode 代表左子樹
    • RightNode 代表右子樹
    • MiddleNode 代表所有的中間子樹(多叉執行樹), 可以有多個MiddleNode
    • 其餘key-value對統一在同層級的Node和*Node節點顯示

Explain 邏輯計劃詳細語義

  • 樣例sql

     explain 
     select student.id, count(*)
     from test4dmp.student 
     inner join test4dmp.grade on student.id =grade.sid 
     inner join test4dmp.elective on elective.id=student.id 
     group by student.id
     having count(*) > 2
     order by student.id 
     limit 10
    
  • 邏輯計劃的explain string

     {
         "Items": ["student.id", "COUNT(*)"],
         "Name": "SelectNode",
         "Node": {
             "Having": "COUNT(*) > 2",
             "Items": ["student.id"],
             "Name": "GroupNode",
             "Node": {
                 "Items": ["student.id"],
                 "Name": "OrderByNode",
                 "Node": {
                     "Name": "JoinNode",
                     "LeftNode": {
                         "Name": "JoinNode",
                         "LeftNode": {
                             "Name": "TableNode",
                             "Schema": ["ID"],
                             "TableName": "STUDENT__1"
                         },
                         "OnCondition": "student.id = grade.sid",
                         "RightNode": {
                             "Name": "TableNode",
                             "Schema": ["SID"],
                             "TableName": "GRADE__9"
                         }
                     },
                     "OnCondition": "elective.id = student.id",
                     "RightNode": {
                         "Name": "TableNode",
                         "Schema": ["ID"],
                         "TableName": "ELECTIVE__1"
                     }
                 }
             }
         },
         "Limit:": "LIMIT 100"
     }
    
  • 邏輯計劃explain string的圖形化展示效果:

  • 邏輯計劃各個節點說明:
    • SelectNode表示這select中最終輸出表達式的相關信息, 例如select要輸出的表達式集合
    • GroupNode表示GroupBy語句的相關信息,例如groupby的列,having的表達式等
    • OrderByNode表示OrderBy的列信息,例如列名,順序等。
    • JoinNode表示邏輯Join樹的信息,例如join的on條件
    • TableNode表示分區表的信息,例如參與計算的列,表名等。

Explain 物理執行計劃詳細語義

  • 樣例sql

     explain 
     select student.id, count(*)
     from test4dmp.student 
     inner join test4dmp.grade on student.id =grade.sid 
     inner join test4dmp.elective on elective.id=student.id 
     group by student.id
     having count(*) > 2
     order by student.id 
     limit 10
    
  • 物理計劃的explain string

     {
         "Name": "JoinExecutor",
         "isDimension": "false",
         "LeftNode": {
             "Name": "TableExecutor",
             "PresortCondition": "null",
             "SecpartCondition": "null",
             "QueryColumns": "ID, BOOLEAN_TEST, LONG_TEST",
             "FilterCondition": "null",
             "ResultRows": 0,
             "PartColumn": "ID",
             "IsDimension": "false",
             "TableName": "TEST__2",
             "QueryCondition": "(ID = 0)"
         },
         "JoinCondition": "TEST__2.ID=TEST__2.ID",
         "RightNode": {
             "Name": "TableExecutor",
             "PresortCondition": "null",
             "SecpartCondition": "null",
             "QueryColumns": "ID, BOOLEAN_TEST",
             "FilterCondition": "null",
             "ResultRows": 0,
             "PartColumn": "ID",
             "IsDimension": "false",
             "TableName": "TEST__2",
             "QueryCondition": "((INT_TEST < 0) AND (ID = 0))"
         },
         "JoinType": "innerJoin",
         "WhereFilter": "(BOOLEAN_TEST = BOOLEAN_TEST)",
         "OnFilter": "null"
     }
    
  • 物理計劃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: 分區表名

最後更新:2016-11-24 11:23:46

  上一篇:go 6.3 使用ACL進行權限管理__第六章 用戶與權限_使用手冊_分析型數據庫-阿裏雲
  下一篇:go 7.2 查看DB性能指標和報告__第七章 性能優化和診斷_使用手冊_分析型數據庫-阿裏雲