分布式执行框架支持的 HINT 包括 ORDERED、LEADING、USE_NL、USE_HASH 和 USE_MERGE 等。

如果某个 query 确定不希望走并行执行框架,使用 NO_USE_PX 拉回数据并生成本地执行计划。

PARALLEL

指定分布式执行的并行度。启用 3 个 worker 并行执行扫描,如下例所示:

注意

在复杂查询中,调度器可以调度 2 个 DFO 并行流水执行,此时,启用的 worker 数量为并行度的2倍,即 PARALLEL * 2。

ORDERED HINT 指定并行查询计划中 JOIN 的顺序,严格按照 FROM 语句中的顺序生成。

如下例所示,强制要求 CUSTOMER 为左表,ORDERS 为右表,并且使用 NESTED LOOP JOIN:

在手写 SQL 时,ORDERED 较为有用,用户知道 JOIN 的最佳顺序时,可以将表按照顺序写在 FROM 的后面,然后加上 ORDERED HINT。

LEADING

LEADING HINT 指定并行查询计划中最先 JOIN 哪些表,LEADING 中的表从左到右的顺序,也是 JOIN 的顺序。它比 ORDERED 有更大的灵活性。

注意

如果 ORDERED 和 LEADING 同时使用,仅 ORDERED 生效。

PQ HINT 的基本语法如下:

参数解释如下:

  • tablespec 指定关注的表,关注 JOIN 的右表。

  • outer_distribution 指定左表的数据分发方式。

两表的数据分发方式共有以下六种:

  • HASH, HASH

  • BROADCAST, NONE

  • NONE, BROADCAST

  • PARTITION, NONE

其中,带分区的两种分发方式要求左表或右表有分区,而且分区键就是 JOIN 的键。如果不满足要求的话,PQ HINT 不会生效。

USE_NL

USE_NL HINT 指定 JOIN 使用 NESTED LOOP JOIN,并且需要满足 USE_NL 中指定的表是 JOIN 的右表。

如下例所示,如果希望 join1 为 NESTED LOOP JOIN,则 HINT 写法为 LEADING(a, (b,c)) USE_NL((b,c))

当 USE_NLJ 和 ORDERED、LEADING HINT 一起使用时,如果 USE_NLJ 中注明的表不是右表,则 USE_NLJ HINT 会被忽略。

USE_HASH HINT 指定 JOIN 使用 HASH JOIN,并且需要满足 USE_HASH 中指定的表是 JOIN 的右表。

注意

如果没有使用 ORDERED 和 LEADING HINT,并且优化器生成的 JOIN 顺序中指定的表之间不是直接 JOIN 的关系,那么 USE_HASH HINT 会被忽略。

USE_MERGE

USE_MERGE HINT 指定 JOIN 使用 MERGE JOIN,并且需要满足 USE_MERGE 中指定的表是 JOIN 的右表。

注意

如果没有使用 ORDERED 和 LEADING HINT,并且优化器生成的 JOIN 顺序中指定的表之间不是直接 JOIN 的关系,那么 USE_MERGE HINT 会被忽略。