EMR StarRocks 极速数据湖分析原理解析( 四 )


select ss_sold_time_sk from store_sales
where ss_sold_date_sk between 2451911 and 2451941
order ss_sold_time_sk;
Join Reorder
多个表的 Join 的查询效率和各个表参与 Join 的顺序有很大关系 。 如 select * from T0, T1, T2 where T0.a=T1.a and T2.a=T1.a , 这个 SQL 中可能的执行顺序有下面两种情况:

  • T0 和 T1 先做 Join , 然后再和 T2 做 Join
  • T1 和 T2 先做 Join , 然后再和 T0 做 Join
根据 T0 和 T2 的数据量及数据分布 , 这两种执行顺序会有不同的性能表现 。 针对这个情况 , StarRocks 在优化器中实现了基于 DP 和贪心的 Join Reorder 机制 。 目前针对 Hive的数据分析 , 已经支持了 Join Reorder , 其他的数据源的支持也正在开发中 。 下面是一个例子:
MySQL [hive_test]> explain select * from T0, T1, T2 where T2.str=T0.str and T1.str=T0.str;
+----------------------------------------------+
Explain String |
+----------------------------------------------+
PLAN FRAGMENT 0 |
OUTPUT EXPRS:1: str | 2: str | 3: str |
PARTITION: UNPARTITIONED |
RESULT SINK |
8:EXCHANGE |
PLAN FRAGMENT 1 |
OUTPUT EXPRS: |
PARTITION: HASH_PARTITIONED: 2: str |
STREAM DATA SINK |
EXCHANGE ID: 08 |
UNPARTITIONED |
7:HASH JOIN |
join op: INNER JOIN (BUCKET_SHUFFLE(S)) |
hash predicates: |
colocate: false, reason: |
equal join conjunct: 1: str = 3: str |
----6:EXCHANGE |
4:HASH JOIN |
join op: INNER JOIN (PARTITIONED) |
hash predicates: |
colocate: false, reason: |
equal join conjunct: 2: str = 1: str |
----3:EXCHANGE |
1:EXCHANGE |
PLAN FRAGMENT 2 |
OUTPUT EXPRS: |
PARTITION: RANDOM |
STREAM DATA SINK |
EXCHANGE ID: 06 |
HASH_PARTITIONED: 3: str |
5:HdfsScanNode |
TABLE: T2 |
partitions=1/1 |
cardinality=1 |
avgRowSize=16.0 |
numNodes=0 |
PLAN FRAGMENT 3 |
OUTPUT EXPRS: |
PARTITION: RANDOM |
STREAM DATA SINK |
EXCHANGE ID: 03 |
HASH_PARTITIONED: 1: str |
2:HdfsScanNode |
TABLE: T0 |
partitions=1/1 |
cardinality=1 |
avgRowSize=16.0 |
numNodes=0 |
PLAN FRAGMENT 4 |
OUTPUT EXPRS: |
PARTITION: RANDOM |
STREAM DATA SINK |
EXCHANGE ID: 01 |
HASH_PARTITIONED: 2: str |
0:HdfsScanNode |
TABLE: T1 |
partitions=1/1 |
cardinality=1 |
avgRowSize=16.0 |
numNodes=0 |
+----------------------------------------------+
谓词下推
谓词下推将查询语句中的过滤表达式计算尽可能下推到距离数据源最近的地方 , 从而减少数据传输或计算的开销 。 针对数据湖场景 , 我们实现了将 Min/Max 等过滤条件下推到 Parquet 中 , 在读取 Parquet 文件的时候 , 能够快速地过滤掉不用的 Row Group 。
比如 , 对于下面的查询 , l_discount=1对应条件会下推到 Parquet 侧 。
MySQL [hive_test]> explain select l_quantity from lineitem where l_discount=1;
+----------------------------------------------------+
Explain String |
+----------------------------------------------------+
PLAN FRAGMENT 0 |
OUTPUT EXPRS:5: l_quantity |
PARTITION: UNPARTITIONED |
RESULT SINK |
2:EXCHANGE |
PLAN FRAGMENT 1 |
OUTPUT EXPRS: |
PARTITION: RANDOM |
STREAM DATA SINK |
EXCHANGE ID: 02 |
UNPARTITIONED |
1:Project |
<slot 5> : 5: l_quantity |
0:HdfsScanNode |
TABLE: lineitem |
NON-PARTITION PREDICATES: 7: l_discount = 1.0 |
partitions=1/1 |
cardinality=63029965 |
avgRowSize=16.0 |
numNodes=0 |

特别声明:本站内容均来自网友提供或互联网,仅供参考,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。