跳转至

6.8.3.9 使用 Hint 调整 Join Shuffle 方式

1 工作原理

Doris 支持使用 Hint 来调整 Join 操作中数据 Shuffle 的类型,从而优化查询性能。本节将详细介绍如何在 Doris 中利用 Hint 来指定 Join Shuffle 的类型。

目前, Doris 仅限于指定 Join 右表的 Distribute Type ,并且仅提供两种类型供选择: [shuffle][broadcast]Distribute Type 需置于 Join 右表之前,可采用中括号 [] 的方式。

示例如下:

SQL
1
2
3
4
SELECT COUNT(*) FROM t2 JOIN [broadcast] t1 ON t1.c1 = t2.c2;
SELECT COUNT(*) FROM t2 JOIN [shuffle] t1 ON t1.c1 = t2.c2;
SELECT /*+ ordered */ COUNT(*) FROM t2 JOIN [broadcast] t1 ON t1.c1 = t2.c2;
SELECT /*+ ordered */ COUNT(*) FROM t2 JOIN [shuffle] t1 ON t1.c1 = t2.c2;

在使用时,需注意以下事项:

  1. 若遇到无法正确生成执行计划的 DistributeHint 时, Doris 不会显示该 Hint ,而是会按“最大努力”原则使其生效。最终,以 EXPLAIN 显示的 Distribute 方式为准。

  2. 在当前版本中, DistributeHint 暂不支持与 LEADING 混用,且仅当 Distribute 指定的表位于 Join 右边时, Hint 才会生效。

  3. 建议将 DistributeHintORDERED 混用。首先利用 ORDERED 固定 Join 顺序,然后再指定相应 Join 中预期使用的 Distribute 方式。

2 调优案例

接下来,我们将通过同一个例子来展示 Hint 的使用方法:

  1. 使用前:

    SQL
    1
    EXPLAIN SHAPE PLAN SELECT COUNT(*) FROM t1 JOIN t2 ON t1.c1 = t2.c2;
    

    结果:

    SQL
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    +----------------------------------------------------------------------------------+  
    | Explain String (Nereids Planner)                                                 |  
    +----------------------------------------------------------------------------------+  
    | PhysicalResultSink                                                               |  
    | --hashAgg [GLOBAL]                                                               |  
    | ----PhysicalDistribute [DistributionSpecGather]                                  |  
    | ------hashAgg [LOCAL]                                                            |  
    | --------PhysicalProject                                                          |  
    | ----------hashJoin [INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=()|  
    | ------------PhysicalProject                                                      |  
    | --------------PhysicalOlapScan [t1]                                              |  
    | ------------PhysicalDistribute [DistributionSpecHash]                            |  
    | --------------PhysicalProject                                                    |  
    | ----------------PhysicalOlapScan [t2]                                            |  
    +----------------------------------------------------------------------------------+
    
  2. 使用后:

    SQL
    1
    EXPLAIN SHAPE PLAN SELECT /*+ ordered */ COUNT(*) FROM t2 JOIN [broadcast] t1 ON t1.c1 = t2.c2;
    

    结果:

    SQL
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    +----------------------------------------------------------------------------------+  
    | Explain String (Nereids Planner)                                                 |  
    +----------------------------------------------------------------------------------+  
    | PhysicalResultSink                                                               |  
    | --hashAgg [GLOBAL]                                                               |  
    | ----PhysicalDistribute [DistributionSpecGather]                                  |  
    | ------hashAgg [LOCAL]                                                            |  
    | --------PhysicalProject                                                          |  
    | ----------hashJoin [INNER_JOIN] hashCondition=((t1.c1 = t2.c2)) otherCondition=()|  
    | ------------PhysicalProject                                                      |  
    | --------------PhysicalOlapScan [t2]                                              |  
    | ------------PhysicalDistribute [DistributionSpecReplicated]                      |  
    | --------------PhysicalProject                                                    |  
    | ----------------PhysicalOlapScan [t1]                                            |  
    |                                                                                  |  
    | Hint log:                                                                        |  
    | Used: ORDERED                                                                    |  
    | UnUsed:                                                                          |  
    | SyntaxError:                                                                     |  
    +----------------------------------------------------------------------------------+
    

    EXPLAIN 结果中,可以看到 Distribute 算子的相关信息:

    1. DistributionSpecReplicated 表示将对应的数据复制到所有 BE 节点。

    2. DistributionSpecGather 表示将数据 GatherFE 节点。

    3. DistributionSpecHash 表示将数据按照特定的 HashKey 和算法打散到不同的 BE 节点。

3 总结

通过合理使用 DistributeHint ,可以优化 Join 操作的 Shuffle 方式,提升查询性能。在实践中,建议先通过 EXPLAIN 分析查询执行计划,再根据实际情况选择合适的 Shuffle 类型。在使用时,需注意以下事项:

  1. 若遇到无法正确生成执行计划的 DistributeHint 时, Doris 不会显示该 Hint ,而是会按“最大努力”原则使其生效。最终,以 EXPLAIN 显示的 Distribute 方式为准。

  2. 在当前版本中, DistributeHint 暂不支持与 LEADING 混用,且仅当 Distribute 指定的表位于 Join 右边时, Hint 才会生效。

  3. 建议将 DistributeHintORDERED 混用。首先利用 ORDERED 固定 Join 顺序,然后再指定相应 Join 中预期使用的 Distribute 方式。