基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
与并行执行相关的 Hint
更新时间:2024-04-25 16:55:36
与并行执行相关的 Hint 包括 PARALLEL Hint、NO_PARALLEL Hint、USE_PX Hint、ENABLE_PARALLEL_DAS_DML Hint、DISABLE_PARALLEL_DAS_DML 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;
ENABLE_PARALLEL_DML Hint
ENABLE_PARALLEL_DML Hint 指定当前查询开启并行 DML,其反向 Hint 为 DISABLE_PARALLEL_DML,用于禁止并行 DML。
有关并行 DML 的更多信息,参见 并行 DML。
注意事项
使用
/*+ENABLE_PARALLEL_DML PARALLEL(n)*/时,系统会优先考虑使用分布式并行 DML(PDML)。如果当前环境不支持 PDML,系统会回退到 DAS 并发写作为性能优化手段。当在会话(session)级别设置了强制并行度,其执行行为将与上述行为保持一致。
即使在当前环境不支持并行 DML (PDML) 的情况下,如果系统参数
_enable_parallel_das_dml被通过ALTER SYSTEM SET命令设置为true(其默认值为false),则即使使用了 Hint/*+ENABLE_PARALLEL_DML PARALLEL(n)*/,系统也不会启用 DAS(分布式活动存储)的并行写操作。当通过
ALTER SYSTEM SET命令将_enable_parallel_das_dml设置为true(默认为false),并且在会话级别已经设置了强制并行度,那么即使当前环境不支持 PDML,使用 Hint/*+ENABLE_PARALLEL_DML PARALLEL(n)*/也不会启用 DAS 的并行写功能。
语法
/*+ ENABLE_PARALLEL_DML */
示例
insert /*+ enable_parallel_dml parallel(8) */ into t2 select * from t1;
DISABLE_PARALLEL_DML Hint
DISABLE_PARALLEL_DML Hint 指定当前查询禁用并行 DML,其反向 Hint 为 ENABLE_PARALLEL_DML,用于开启并行 DML。
有关并行 DML 的更多信息,参见 并行 DML。
语法
/*+ DISABLE_PARALLEL_DML */
示例
insert /*+ disable_parallel_dml parallel(8) */ into t2 select * from t1;
ENABLE_PARALLEL_DAS_DML Hint
ENABLE_PARALLEL_DAS_DML Hint 用于指定当前 DML 语句强制开启使用 Distributed Active Storage (DAS) 并发写优化。其反向 Hint 为 DISABLE_PARALLEL_DAS_DML。
注意事项
ENABLE_PARALLEL_DAS_DML需要配合ENABLE_PARALLEL_DML一起使用。在 Hint
/*+ENABLE_PARALLEL_DAS_DML ENABLE_PARALLEL_DML PARALLEL(n)*/的作用下,系统会将 DAS 并发写作为强制选项,并根据PARALLEL(n)指定的并行度来执行操作。将系统参数
_enable_parallel_das_dml通过ALTER SYSTEM SET语句设置为true(默认为false)将会导致 Hint/*+ENABLE_PARALLEL_DAS_DML ENABLE_PARALLEL_DML PARALLEL(n)*/无效。此时,系统将不会执行 DAS 的并行写操作。
语法
/*+ ENABLE_PARALLEL_DAS_DML */
示例
insert /*+ ENABLE_PARALLEL_DAS_DML ENABLE_PARALLEL_DML PARALLEL(10)*/
into t1 select * from t2;
DISABLE_PARALLEL_DAS_DML Hint
DISABLE_PARALLEL_DAS_DML Hint 用于指定当前 DML 语句强制关闭使用 Distributed Active Storage (DAS) 并发写优化。其反向 Hint 为 ENABLE_PARALLEL_DAS_DML。
注意事项
DISABLE_PARALLEL_DAS_DML需要配合ENABLE_PARALLEL_DML一起使用。使用 Hint
/*+DISABLE_PARALLEL_DAS_DML ENABLE_PARALLEL_DML PARALLEL(n)*/,系统会禁用 DAS 并发写,即使其他并发写优化选项如 PDML 被启用。
语法
/*+ DISABLE_PARALLEL_DAS_DML */
示例
insert /*+ DISABLE_PARALLEL_DAS_DML ENABLE_PARALLEL_DML PARALLEL(10)*/
into t1 select * from t2;
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;