首批通过分布式安全可靠测评,为关键业务系统打造
与并行执行相关的 Hint
更新时间:2023-08-01 14:14:04
与并行执行相关的 Hint 包括 PARALLEL Hint、NO_PARALLEL Hint、USE_PX Hint 和 PQ_DISTRIBUTE Hint。
PARALLEL Hint
PARALLEL Hint 是语句级的 Hint,用来指示优化器指定并行操作可使用的并行线程的数量。此 Hint 将覆盖初始化参数 PARALLEL_DEGREE_ POLICY 的值。该 Hint 可以作为 SELECT、INSERT、UPDATE 和 DELETE 语句的一部分,以及表扫描的一部分。如果违反了任何的并行限制,则 PARALLEL Hint 被忽略。
PARALLEL Hint 的语法如下:
/*+ PARALLEL(n) */
PARALLE Hint 中参数 n 的值用来指定并行度。如果同时进行了排序或分组操作,那么可以使用的线程数量是 PARALLEL Hint 设定值的两倍。
以下示例中,指定数据库的并行度为 5:
SELECT /*+ PARALLEL(5) */ last_name
FROM emp;
OceanBase 数据库也支持表级别的 PARALLEL Hint,语法如下:
/*+ PARALLEL(table_name n) */
如果同时指定了全局并行度和表级并行度,则表级并行度不会生效。
NO_PARALLEL Hint
NO_PARALLEL Hint 指示优化器串行运行语句。它会覆盖用于创建或更改表的 PARALLEL 参数。
NO_PARALLEL Hint 的语法如下:
/*+ NO_PARALLEL ( [ @queryblock ] tablespec ) */
以下示例中,NO_PARALLEL Hint 覆盖了 PARALLEL 参数值。
ALTER TABLE emp PARALLEL 6;
SELECT /*+ NO_PARALLEL(hr_emp) */ last_name
FROM emp hr_emp;
USE_PX Hint
USE_PX Hint 强制指示服务器在执行 SQL 语句时使用 PX 模式,PX 模式允许在执行语句时采用多线程方式。一般 USE_PX Hint 和 PARALLEL Hint 配合使用。
USE_PX Hint 的语法如下:
/*+ USE_PX */
USE_PX Hint 的示例如下:
SELECT /*+ USE_PX PARALLEL(4)*/ e.dept_id, sum(e.salary)
FROM emp e
WHERE e.dept_id = 1001 GROUP BY e.dept_id;
PQ_DISTRIBUTE Hint
PQ_DISTRIBUTE Hint 指示优化器怎样在程序(查询)服务器和消耗(负载)查询服务器之间分配行。您可以通过该 Hint 控制联接或负载的行分布。 PQ_DISTRIBUTE Hint 的语法如下:
/*+ PQ_DISTRIBUTE
( [ @queryblock ] tablespec
{ distribution | outer_distribution inner_distribution }
) */
控制联接的分配
您可以通过指定两种分配方法来控制联接的分发方式。
如语法中的下部分支所示:
outer_distribution指定左表的数据分发方式。inner_distribution指定右表的数据分发方式。
分发方式包括 HASH、BROADCAST、PARTITION 和 NONE。只有下表中的 6 种分发方式组合是有效的:
| 分发方式 | 说明 |
|---|---|
| HASH, HASH | 使用联接键上的哈希函数,将每个表的行映射到查询服务器。映射完成后,每个查询服务器都会在一对结果分区之间执行联接。 当表的大小可比较并且联接操作是通过哈希联接或排序合并联接实现时,建议使用此分发方式。 |
| BROADCAST, NONE | 外部表的所有行都广播到每个查询服务器。内部表行是随机分区的。 当外部表与内部表相比非常小时,建议使用此分布方法。通常,当内部表大小乘以查询服务器的数量大于外部表大小时,也建议使用此分发方式。 |
| NONE, BROADCAST | 内部表的所有行都广播给每个查询服务器。外部表行是随机分区的。 当内部表与外部表相比非常小时,建议使用此分布方法。通常,当内部表大小乘以查询服务器的数量小于外部表大小时,也建议使用此分发方式。 |
| PARTITION, NONE | 外部表的行使用以内部表的分区进行映射。内部表必须在联接键上进行分区。 当外部表的分区数等于或几乎等于查询服务器数的倍数时,建议使用此分发方式。例如,有 14 个分区和 15 个查询服务器。 注意 如果内部表未分区或未在分区键上等分联接时,优化器将忽略此 Hint。 |
| NONE, PARTITION | 内部表的行使用外部表的分区进行映射。外部表必须在联接键上进行分区。 当外部表的分区数等于或几乎等于查询服务器数的倍数时,建议使用此分发方式。例如,有 14 个分区和 15 个查询服务器。 注意 如果外部表未在分区键上进行分区或未等分联接时,优化器将忽略此 Hint。 |
| NONE, NONE | 每个查询服务器在一对匹配的分区之间执行联接操作,每个表中都有一个。两个表必须在联接键上等分。 |
例如,指定使用哈希联接来联接两个表 r 和 s,以下查询包含使用哈希分发方式的 Hint:
SELECT /*+ORDERED PQ_DISTRIBUTE(s HASH, HASH) USE_HASH (s)*/ column_list
FROM r,s
WHERE r.c=s.c;
如果要广播外部表 r,包含 Hint 的查询语句如下:
SELECT /*+ORDERED PQ_DISTRIBUTE(s BROADCAST, NONE) USE_HASH (s) */ column_list
FROM r,s
WHERE r.c=s.c;