当前位置:   article > 正文

Doris的查询计划

Doris的查询计划

本文章向大家介绍Doris的查询计划,主要内容包括1、查询计划、2、MySQL查询计划、2、Doris的查询计划、(2)聚合、(3)关联查询、(4)查询 Profile、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

1、查询计划

SQL语句只告诉机器干什么,没有告诉具体怎么干。DBMS内嵌了查询优化器,对用户透明。 但是有时候我们写的SQL语言查询很慢,就需要通过查询计划看看机器具体是怎么执行这个SQL的,确定查询慢的瓶颈问题,然后修改SQL进行优化。

2、MySQL查询计划

(1)MySQL使用explain + sql语法查看执行计划

  1. MariaDB [(none)]> use test;
  2. Reading table information for completion of table and column names
  3. You can turn off this feature to get a quicker startup with -A
  4. Database changed
  5. MariaDB [test]> EXPLAIN SELECT * FROM test.users;
  6. +------+-------------+-------+------+---------------+------+---------+------+------+-------+
  7. | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
  8. +------+-------------+-------+------+---------------+------+---------+------+------+-------+
  9. | 1 | SIMPLE | users | ALL | NULL | NULL | NULL | NULL | 3 | |
  10. +------+-------------+-------+------+---------------+------+---------+------+------+-------+
  11. 1 row in set (0.00 sec)
  12. MariaDB [test]>

(2)该查询类型select_type是简单查询SIMPLE,此外还有其他查询类型

  • SIMPLE :简单查询
  • PRIMARY:最外层查询
  • SUBQUERY:映射为子查询
  • DERIVED:子查询
  • UNION:联合
  • UNION RESULT:使用联合的结果

(3)table字段表示MySQL在表中找到所需行的方式,又称访问类型。

  • ALL:全数据表扫描
  • INDEX:全索引表扫描
  • RANGE:对索引列进行范围查找,常见于between、<、>等的查询
  • INDEX_MERGE:合并索引,使用多个单列索引搜索
  • REF:根据索引查找一个或多个值
  • EQ_REF:扫描时使用primary key 或 unique类型
  • CONST:const表很快,只读取一次
  • SYSTEM:system是const类型的特例,表仅有一行。

(4)查询性能

ALL < index < range < index_merge < ref_or_null < ref < eq_ref < system/const

2、Doris的查询计划

分布式查询计划是由多个 Fragment 组成的,每个 Fragment 负责查询计划的一部分,各个 Fragment 直接会通过 ExchangeNode 算子进行数据的传输。

(1)简单查询

  1. MySQL [tpa]> explain graph SELECT * FROM t1;
  2. +-----------------------------------------------------------------+
  3. | Explain String |
  4. +-----------------------------------------------------------------+
  5. | |
  6. | ┌───────────────┐ |
  7. | │[1: ResultSink]│ |
  8. | │[Fragment: 1] │ |
  9. | │RESULT SINK │ |
  10. | └───────────────┘ |
  11. | │ |
  12. | │ |
  13. | ┌─────────────┐ |
  14. | │[1: EXCHANGE]│ |
  15. | │[Fragment: 1]│ |
  16. | └─────────────┘ |
  17. | │ |
  18. | │ |
  19. | ┌───────────────────┐ |
  20. | │[1: DataStreamSink]│ |
  21. | │[Fragment: 0] │ |
  22. | │STREAM DATA SINK │ |
  23. | │ EXCHANGE ID: 01 │ |
  24. | │ UNPARTITIONED │ |
  25. | └───────────────────┘ |
  26. | │ |
  27. | │ |
  28. | ┌─────────────────┐ |
  29. | │[0: OlapScanNode]│ |
  30. | │[Fragment: 0] │ |
  31. | │TABLE: t1 │ |
  32. | └─────────────────┘ |
  33. +-----------------------------------------------------------------+
  34. 28 rows in set (0.00 sec)
  35. MySQL [tpa]> explain SELECT * FROM t1;
  36. +-------------------------------------------------------------------------------------------------------------------------------------------------------------+
  37. | Explain String |
  38. +-------------------------------------------------------------------------------------------------------------------------------------------------------------+
  39. | PLAN FRAGMENT 0 |
  40. | OUTPUT EXPRS:`default_cluster:tpa.t1`.`siteid` | `default_cluster:tpa.t1`.`citycode` | `default_cluster:tpa.t1`.`username` | `default_cluster:tpa.t1`.`pv` |
  41. | PARTITION: UNPARTITIONED |
  42. | |
  43. | RESULT SINK |
  44. | |
  45. | 1:EXCHANGE |
  46. | |
  47. | PLAN FRAGMENT 1 |
  48. | OUTPUT EXPRS: |
  49. | PARTITION: RANDOM |
  50. | |
  51. | STREAM DATA SINK |
  52. | EXCHANGE ID: 01 |
  53. | UNPARTITIONED |
  54. | |
  55. | 0:OlapScanNode |
  56. | TABLE: t1 |
  57. | PREAGGREGATION: OFF. Reason: No AggregateInfo |
  58. | partitions=1/1 |
  59. | rollup: t1 |
  60. | tabletRatio=10/10 |
  61. | tabletList=439810,439813,439816,439819,439822,439825,439828,439831,439834,439837 |
  62. | cardinality=5 |
  63. | avgRowSize=30.0 |
  64. | numNodes=3 |
  65. +-------------------------------------------------------------------------------------------------------------------------------------------------------------+
  66. 26 rows in set (0.00 sec)
  67. MySQL [tpa]>

(2)聚合

  1. MySQL [tpa]> explain graph SELECT SUM(t1.pv) FROM t1;
  2. +-----------------------------------------------------------------------------------------------------------+
  3. | Explain String |
  4. +-----------------------------------------------------------------------------------------------------------+
  5. | |
  6. | ┌───────────────┐ |
  7. | │[3: ResultSink]│ |
  8. | │[Fragment: 1] │ |
  9. | │RESULT SINK │ |
  10. | └───────────────┘ |
  11. | │ |
  12. | │ |
  13. | ┌───────────────────────────────┐ |
  14. | │[3: AGGREGATE (merge finalize)]│ |
  15. | │[Fragment: 1] │ |
  16. | └───────────────────────────────┘ |
  17. | │ |
  18. | │ |
  19. | ┌─────────────┐ |
  20. | │[2: EXCHANGE]│ |
  21. | │[Fragment: 1]│ |
  22. | └─────────────┘ |
  23. | │ |
  24. | │ |
  25. | ┌───────────────────┐ |
  26. | │[2: DataStreamSink]│ |
  27. | │[Fragment: 0] │ |
  28. | │STREAM DATA SINK │ |
  29. | │ EXCHANGE ID: 02 │ |
  30. | │ UNPARTITIONED │ |
  31. | └───────────────────┘ |
  32. | │ |
  33. | │ |
  34. | ┌─────────────────────────────────┐ |
  35. | │[1: AGGREGATE (update serialize)]│ |
  36. | │[Fragment: 0] │ |
  37. | └─────────────────────────────────┘ |
  38. | │ |
  39. | │ |
  40. | ┌─────────────────┐ |
  41. | │[0: OlapScanNode]│ |
  42. | │[Fragment: 0] │ |
  43. | │TABLE: t1 │ |
  44. | └─────────────────┘ |
  45. +-----------------------------------------------------------------------------------------------------------+
  46. 40 rows in set (0.01 sec)
  47. MySQL [tpa]> explain SELECT SUM(t1.pv) FROM t1;
  48. +---------------------------------------------------------------------------------------+
  49. | Explain String |
  50. +---------------------------------------------------------------------------------------+
  51. | PLAN FRAGMENT 0 |
  52. | OUTPUT EXPRS: sum(`t1`.`pv`) |
  53. | PARTITION: UNPARTITIONED |
  54. | |
  55. | RESULT SINK |
  56. | |
  57. | 3:AGGREGATE (merge finalize) |
  58. | | output: sum( sum(`t1`.`pv`)) |
  59. | | group by: |
  60. | | cardinality=-1 |
  61. | | |
  62. | 2:EXCHANGE |
  63. | |
  64. | PLAN FRAGMENT 1 |
  65. | OUTPUT EXPRS: |
  66. | PARTITION: RANDOM |
  67. | |
  68. | STREAM DATA SINK |
  69. | EXCHANGE ID: 02 |
  70. | UNPARTITIONED |
  71. | |
  72. | 1:AGGREGATE (update serialize) |
  73. | | output: sum(`t1`.`pv`) |
  74. | | group by: |
  75. | | cardinality=1 |
  76. | | |
  77. | 0:OlapScanNode |
  78. | TABLE: t1 |
  79. | PREAGGREGATION: ON |
  80. | partitions=1/1 |
  81. | rollup: t1 |
  82. | tabletRatio=10/10 |
  83. | tabletList=439810,439813,439816,439819,439822,439825,439828,439831,439834,439837 |
  84. | cardinality=4 |
  85. | avgRowSize=8.0 |
  86. | numNodes=3 |
  87. +---------------------------------------------------------------------------------------+
  88. 36 rows in set (0.01 sec)
  89. MySQL [tpa]>

(3)关联查询

  1. MySQL [tpa]> SELECT SUM(t1.pv) FROM t1 JOIN t2 WHERE t1.siteid = t2.siteid;
  2. +----------------+
  3. | sum(`t1`.`pv`) |
  4. +----------------+
  5. | 12 |
  6. +----------------+
  7. 1 row in set (0.29 sec)
  8. MySQL [tpa]> SELECT SUM(pv) FROM t2 WHERE siteid IN (SELECT siteid FROM t1 WHERE siteid > 2);
  9. +-----------+
  10. | sum(`pv`) |
  11. +-----------+
  12. | 8 |
  13. +-----------+
  14. 1 row in set (0.36 sec)
  15. MySQL [tpa]> explain SELECT SUM(t1.pv) FROM t1 JOIN t2 WHERE t1.siteid = t2.siteid;
  16. +---------------------------------------------------------------------------------------+
  17. | Explain String |
  18. +---------------------------------------------------------------------------------------+
  19. | PLAN FRAGMENT 0 |
  20. | OUTPUT EXPRS:<slot 3> sum(`t1`.`pv`) |
  21. | PARTITION: UNPARTITIONED |
  22. | |
  23. | RESULT SINK |
  24. | |
  25. | 6:AGGREGATE (merge finalize) |
  26. | | output: sum(<slot 3> sum(`t1`.`pv`)) |
  27. | | group by: |
  28. | | cardinality=-1 |
  29. | | |
  30. | 5:EXCHANGE |
  31. | |
  32. | PLAN FRAGMENT 1 |
  33. | OUTPUT EXPRS: |
  34. | PARTITION: RANDOM |
  35. | |
  36. | STREAM DATA SINK |
  37. | EXCHANGE ID: 05 |
  38. | UNPARTITIONED |
  39. | |
  40. | 3:AGGREGATE (update serialize) |
  41. | | output: sum(`t1`.`pv`) |
  42. | | group by: |
  43. | | cardinality=1 |
  44. | | |
  45. | 2:HASH JOIN |
  46. | | join op: INNER JOIN (BUCKET_SHUFFLE) |
  47. | | runtime filter: true |
  48. | | hash predicates: |
  49. | | colocate: false, reason: table not in the same group |
  50. | | equal join conjunct: `t1`.`siteid` = `t2`.`siteid` |
  51. | | cardinality=4 |
  52. | | |
  53. | |----4:EXCHANGE |
  54. | | |
  55. | 0:OlapScanNode |
  56. | TABLE: t1 |
  57. | PREAGGREGATION: ON |
  58. | partitions=1/1 |
  59. | rollup: t1 |
  60. | tabletRatio=10/10 |
  61. | tabletList=439810,439813,439816,439819,439822,439825,439828,439831,439834,439837 |
  62. | cardinality=4 |
  63. | avgRowSize=12.0 |
  64. | numNodes=3 |
  65. | |
  66. | PLAN FRAGMENT 2 |
  67. | OUTPUT EXPRS: |
  68. | PARTITION: RANDOM |
  69. | |
  70. | STREAM DATA SINK |
  71. | EXCHANGE ID: 04 |
  72. | BUCKET_SHFFULE_HASH_PARTITIONED: `t2`.`siteid` |
  73. | |
  74. | 1:OlapScanNode |
  75. | TABLE: t2 |
  76. | PREAGGREGATION: OFF. Reason: null |
  77. | partitions=1/3 |
  78. | rollup: t2 |
  79. | tabletRatio=10/10 |
  80. | tabletList=440143,440146,440149,440152,440155,440158,440161,440164,440167,440170 |
  81. | cardinality=0 |
  82. | avgRowSize=4.0 |
  83. | numNodes=1 |
  84. +---------------------------------------------------------------------------------------+
  85. 65 rows in set (0.73 sec)
  86. MySQL [tpa]> explain graph SELECT SUM(t1.pv) FROM t1 JOIN t2 WHERE t1.siteid = t2.siteid;
  87. +-------------------------------------------------------------------------------------------------------------------------------+
  88. | Explain String |
  89. +-------------------------------------------------------------------------------------------------------------------------------+
  90. | |
  91. | ┌───────────────┐ |
  92. | │[6: ResultSink]│ |
  93. | │[Fragment: 2] │ |
  94. | │RESULT SINK │ |
  95. | └───────────────┘ |
  96. | │ |
  97. | │ |
  98. | ┌───────────────────────────────┐ |
  99. | │[6: AGGREGATE (merge finalize)]│ |
  100. | │[Fragment: 2] │ |
  101. | └───────────────────────────────┘ |
  102. | │ |
  103. | │ |
  104. | ┌─────────────┐ |
  105. | │[5: EXCHANGE]│ |
  106. | │[Fragment: 2]│ |
  107. | └─────────────┘ |
  108. | │ |
  109. | │ |
  110. | ┌───────────────────┐ |
  111. | │[5: DataStreamSink]│ |
  112. | │[Fragment: 0] │ |
  113. | │STREAM DATA SINK │ |
  114. | │ EXCHANGE ID: 05 │ |
  115. | │ UNPARTITIONED │ |
  116. | └───────────────────┘ |
  117. | │ |
  118. | │ |
  119. | ┌─────────────────────────────────┐ |
  120. | │[3: AGGREGATE (update serialize)]│ |
  121. | │[Fragment: 0] │ |
  122. | └─────────────────────────────────┘ |
  123. | │ |
  124. | │ |
  125. | ┌────────────────────────────────────┐ |
  126. | │[2: HASH JOIN] │ |
  127. | │[Fragment: 0] │ |
  128. | │join op: INNER JOIN (BUCKET_SHUFFLE)│ |
  129. | └────────────────────────────────────┘ |
  130. | ┌─────────────────┴─────────┐ |
  131. | │ │ |
  132. | ┌─────────────────┐ ┌─────────────┐ |
  133. | │[0: OlapScanNode]│ │[4: EXCHANGE]│ |
  134. | │[Fragment: 0] │ │[Fragment: 0]│ |
  135. | │TABLE: t1 │ └─────────────┘ |
  136. | └─────────────────┘ │ |
  137. | │ |
  138. | ┌─────────────────────────────────┐ |
  139. | │[4: DataStreamSink] │ |
  140. | │[Fragment: 1] │ |
  141. | │STREAM DATA SINK │ |
  142. | │ EXCHANGE ID: 04 │ |
  143. | │ BUCKET_SHFFULE_HASH_PARTITIONED│ |
  144. | └─────────────────────────────────┘ |
  145. | │ |
  146. | │ |
  147. | ┌─────────────────┐ |
  148. | │[1: OlapScanNode]│ |
  149. | │[Fragment: 1] │ |
  150. | │TABLE: t2 │ |
  151. | └─────────────────┘ |
  152. +-------------------------------------------------------------------------------------------------------------------------------+
  153. 62 rows in set (0.21 sec)

(4)查询 Profile

Profile 包含查询语句各个节点的具体执行情况,可以帮助我们分析查询瓶颈。

先开启is_report_success

  1. MySQL [tpa]> show query profile "/"G
  2. Empty set (0.01 sec)
  3. MySQL [tpa]> SET is_report_success=true;
  4. Query OK, 0 rows affected (0.00 sec)
  1. MySQL [tpa]> show query profile "/"G
  2. Empty set (0.00 sec)
  3. MySQL [tpa]> SELECT SUM(t1.pv) FROM t1 JOIN t2 WHERE t1.siteid = t2.siteid;
  4. +----------------+
  5. | sum(`t1`.`pv`) |
  6. +----------------+
  7. | 12 |
  8. +----------------+
  9. 1 row in set (2.45 sec)
  10. MySQL [tpa]> show query profile "/"G
  11. *************************** 1. row ***************************
  12. QueryId: 15400462342f4d04-b294791b760d77e7
  13. User: default_cluster:test
  14. DefaultDb: default_cluster:tpa
  15. SQL: SELECT SUM(t1.pv) FROM t1 JOIN t2 WHERE t1.siteid = t2.siteid
  16. QueryType: Query
  17. StartTime: 2021-08-26 09:54:04
  18. EndTime: 2021-08-26 09:54:04
  19. TotalTime: 118ms
  20. QueryState: EOF
  21. 1 row in set (0.00 sec)
  22. MySQL [tpa]> show query profile "/15400462342f4d04-b294791b760d77e7"G
  23. *************************** 1. row ***************************
  24. Fragments:
  25. ┌────────────────────────┐
  26. │[-1: DataBufferSender] │
  27. │Fragment: 0
  28. │MaxActiveTime: 106.143ms│
  29. └────────────────────────┘
  30. ┌─────────────────────┐
  31. │[6: AGGREGATION_NODE]│
  32. │Fragment: 0
  33. └─────────────────────┘
  34. ┌──────────────────┐
  35. │[5: EXCHANGE_NODE]│
  36. │Fragment: 0
  37. └──────────────────┘
  38. ┌────────────────────────┐
  39. │[5: DataStreamSender] │
  40. │Fragment: 1
  41. │MaxActiveTime: 101.428ms│
  42. └────────────────────────┘
  43. ┌─────────────────────┐
  44. │[3: AGGREGATION_NODE]│
  45. │Fragment: 1
  46. └─────────────────────┘
  47. ┌───────────────────┐
  48. │[2: HASH_JOIN_NODE]│
  49. │Fragment: 1
  50. └───────────────────┘
  51. ┌────────────┴──────────┐
  52. │ │
  53. ┌───────────────────┐ ┌──────────────────┐
  54. │[0: OLAP_SCAN_NODE]│ │[4: EXCHANGE_NODE]│
  55. │Fragment: 1 │ │Fragment: 1
  56. └───────────────────┘ └──────────────────┘
  57. │ │
  58. │ │
  59. ┌─────────────┐ ┌───────────────────────┐
  60. │[OlapScanner]│ │[4: DataStreamSender] │
  61. │Fragment: 1 │ │Fragment: 2
  62. └─────────────┘ │MaxActiveTime: 79.987ms│
  63. │ └───────────────────────┘
  64. │ │
  65. ┌─────────────────┐ │
  66. │[SegmentIterator]│ ┌───────────────────┐
  67. │Fragment: 1 │ │[1: OLAP_SCAN_NODE]│
  68. └─────────────────┘ │Fragment: 2
  69. └───────────────────┘
  70. ┌─────────────┐
  71. │[OlapScanner]│
  72. │Fragment: 2
  73. └─────────────┘
  74. ┌─────────────────┐
  75. │[SegmentIterator]│
  76. │Fragment: 2
  77. └─────────────────┘
  78. 1 row in set (0.00 sec)
  79. MySQL [tpa]>
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/892300
推荐阅读
相关标签
  

闽ICP备14008679号