---
title: "与并行执行相关的 Hint - OceanBase 数据库 V4.2.0 | OceanBase 文档中心"
description: 与并行执行相关的 Hint 与并行执行相关的 Hint 包括 PARALLEL Hint、NO_PARALLEL Hint、USE_PX Hint 和 PQ_DISTRIBUTE Hint。 PARALLEL Hint PARALLEL Hint 是语句级的 Hint，用来指示优化器指定并行操作可使用的并行线程的数量…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.2.0

# 与并行执行相关的 Hint

更新时间：2023-08-01 14:14:04

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.2.0/zh-CN/700.reference/500.sql-reference/100.sql-syntax/300.common-tenant-of-oracle-mode/300.basic-elements-of-oracle-mode/600.annotation-of-oracle-mode/400.hint-of-oracle-mode/200.hint-list-of-oracle-mode/400.hints-related-to-parallel-execution-of-oracle-mode.md)  

与并行执行相关的 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 的语法如下：

```sql
/*+ PARALLEL(n) */

```

`PARALLE` Hint 中参数 `n` 的值用来指定并行度。如果同时进行了排序或分组操作，那么可以使用的线程数量是 `PARALLEL` Hint 设定值的两倍。

以下示例中，指定数据库的并行度为 5：

```sql
SELECT /*+ PARALLEL(5) */ last_name
FROM emp;

```

OceanBase 数据库也支持表级别的 `PARALLEL` Hint，语法如下：

```sql
/*+ PARALLEL(table_name n) */

```

如果同时指定了全局并行度和表级并行度，则表级并行度不会生效。

## NO_PARALLEL Hint

`NO_PARALLEL` Hint 指示优化器串行运行语句。它会覆盖用于创建或更改表的 `PARALLEL` 参数。

`NO_PARALLEL` Hint 的语法如下：

```sql
/*+ NO_PARALLEL ( [ @queryblock ] tablespec ) */

```

以下示例中，`NO_PARALLEL` Hint 覆盖了 `PARALLEL` 参数值。

```sql
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 的语法如下：

```sql
/*+ USE_PX */

```

`USE_PX` Hint 的示例如下：

```sql
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 的语法如下：

```sql
/*+ 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：

```sql
SELECT /*+ORDERED PQ_DISTRIBUTE(s HASH, HASH) USE_HASH (s)*/ column_list
FROM r,s
WHERE r.c=s.c;

```

如果要广播外部表 `r`，包含 Hint 的查询语句如下：

```sql
SELECT /*+ORDERED PQ_DISTRIBUTE(s BROADCAST, NONE) USE_HASH (s) */ column_list
FROM r,s
WHERE r.c=s.c;

```

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
