Skip to content

Commit

Permalink
add docs for enforce mpp (#6250)
Browse files Browse the repository at this point in the history
  • Loading branch information
LittleFall authored Jun 18, 2021
1 parent 49cb258 commit a5fd0f7
Show file tree
Hide file tree
Showing 3 changed files with 84 additions and 4 deletions.
16 changes: 15 additions & 1 deletion system-variables.md
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,11 @@ mysql> SELECT * FROM t1;

- 作用域:SESSION | GLOBAL
- 默认值:ON(表示开启)
- 这个变量用于控制是否使用 TiFlash 的 MPP 模式执行查询。开启后 TiDB 会通过优化器自动判断是否选择 MPP 执行。MPP 是 TiFlash 引擎提供的分布式计算框架,允许节点之间的数据交换并提供高性能、高吞吐的 SQL 算法。
- 这个变量用于控制是否使用 TiFlash 的 MPP 模式执行查询,可以设置的值包括:
- 0 或 OFF,代表从不使用 MPP 模式
- 1 或 ON,代表由优化器根据代价估算选择是否使用 MPP 模式(默认)

MPP 是 TiFlash 引擎提供的分布式计算框架,允许节点之间的数据交换并提供高性能、高吞吐的 SQL 算法。MPP 模式选择的详细说明参见[控制是否选择 MPP 模式](/tiflash/use-tiflash.md#控制是否选择-mpp-模式)

### `tidb_allow_remove_auto_inc` <span class="version-mark">从 v2.1.18 和 v3.0.4 版本开始引入</span>

Expand Down Expand Up @@ -601,6 +605,16 @@ Query OK, 0 rows affected (0.09 sec)
- 这个变量用来控制是否开启窗口函数的支持。默认值 1 代表开启窗口函数的功能。
- 由于窗口函数会使用一些保留关键字,可能导致原先可以正常执行的 SQL 语句在升级 TiDB 后无法被解析语法,此时可以将 `tidb_enable_window_function` 设置为 `OFF`

### `tidb_enforce_mpp` <span class="version-mark">从 v5.1 版本开始引入</span>

- 作用域:SESSION
- 默认值:OFF(表示关闭)
- 这个变量用于控制是否忽略优化器代价估算,强制使用 TiFlash 的 MPP 模式执行查询,可以设置的值包括:
- 0 或 OFF,代表不强制使用 MPP 模式(默认)
- 1ON,代表将忽略代价估算,强制使用 MPP 模式。注意:只有当 `tidb_allow_mpp=true` 时该设置才生效。

MPP 是 TiFlash 引擎提供的分布式计算框架,允许节点之间的数据交换并提供高性能、高吞吐的 SQL 算法。MPP 模式选择的详细说明参见[控制是否选择 MPP 模式](/tiflash/use-tiflash.md#控制是否选择-mpp-模式)。

### `tidb_evolve_plan_baselines` <span class="version-mark">从 v4.0 版本开始引入</span>

- 作用域:SESSION | GLOBAL
Expand Down
6 changes: 6 additions & 0 deletions tidb-configuration-file.md
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,12 @@ TiDB 配置文件比命令行参数支持更多的选项。你可以在 [config/
+ 默认值:20971520
+`nested-loop-join-cache-capacity = 0` 时,默认关闭 nested loop join cache。 当 LRU 的 size 大于 `nested-loop-join-cache-capacity` 时,也会剔除 LRU 中的元素。

### `enforce-mpp`

+ 用于控制是否忽略优化器代价估算,强制使用 TiFlash 的 MPP 模式执行查询.
+ 默认值:false
+ 该配置项是系统变量 [`tidb_enforce_mpp`](/system-variables.md#tidb_enforce_mpp-从-v51-版本开始引入) 的初始值。

## prepared-plan-cache

prepare 语句的 plan cache 设置。
Expand Down
66 changes: 63 additions & 3 deletions tiflash/use-tiflash.md
Original file line number Diff line number Diff line change
Expand Up @@ -254,12 +254,72 @@ TiFlash 支持部分算子的下推,支持的算子如下:

## 使用 MPP 模式

TiFlash 支持 MPP 模式的查询执行,即在计算中引入跨节点的数据交换(data shuffle 过程)。MPP 模式默认开启,如需关闭可将全局/会话变量 [`tidb_allow_mpp`](/system-variables.md#tidb_allow_mpp-从-v50-版本开始引入) 的值设为 `0` 或 `OFF`:
TiFlash 支持 MPP 模式的查询执行,即在计算中引入跨节点的数据交换(data shuffle 过程)。TiDB 默认由优化器自动选择是否使用 MPP 模式,你可以通过修改变量 [`tidb_allow_mpp`](/system-variables.md#tidb_allow_mpp-从-v50-版本开始引入) 和 [`tidb_enforce_mpp`](/system-variables.md#tidb_enforce_mpp-从-v51-版本开始引入) 的值来更改选择策略。

```shell
set @@session.tidb_allow_mpp=0
### 控制是否选择 MPP 模式

变量 `tidb_allow_mpp` 控制 TiDB 能否选择 MPP 模式执行查询。变量 `tidb_enforce_mpp` 控制是否忽略优化器代价估算,强制使用 TiFlash 的 MPP 模式执行查询。

这两个变量所有取值对应的结果如下:

| | tidb_allow_mpp=off | tidb_allow_mpp=on(默认) |
| ---------------------- | -------------------- | -------------------------------- |
| tidb_enforce_mpp=off(默认) | 不使用 MPP 模式。 | 优化器根据代价估算选择。(默认) |
| tidb_enforce_mpp=on | 不使用 MPP 模式。 | TiDB 无视代价估算,选择 MPP 模式。 |

例如,如果你不想使用 MPP 模式,可以通过以下语句来设置:

{{< copyable "sql" >}}

```sql
set @@session.tidb_allow_mpp=0;
```

如果想要通过优化器代价估算来智能选择是否使用 MPP(默认情况),可以通过如下语句来设置:

{{< copyable "sql" >}}

```sql
set @@session.tidb_allow_mpp=1;
set @@session.tidb_enforce_mpp=0;
```

如果想要 TiDB 忽略优化器的代价估算,强制使用 MPP,可以通过如下语句来设置:

{{< copyable "sql" >}}

```sql
set @@session.tidb_allow_mpp=1;
set @@session.tidb_enforce_mpp=1;
```

Session 变量 `tidb_enforce_mpp` 的初始值等于这台 tidb-server 实例的 [`enforce-mpp`](/tidb-configuration-file.md#enforce-mpp) 配置项值(默认为 `false`)。在一个 TiDB 集群中,如果有若干台 tidb-server 实例只执行分析型查询,要确保它们能够选中 MPP 模式,你可以将它们的 [`enforce-mpp`](/tidb-configuration-file.md#enforce-mpp) 配置值修改为 `true`.

> **注意:**
>
> `tidb_enforce_mpp=1` 在生效时,TiDB 优化器会忽略代价估算选择 MPP 模式。但如果存在其它不支持 MPP 的因素,例如没有 TiFlash 副本、TiFlash 副本同步未完成、语句中含有 MPP 模式不支持的算子或函数等,那么 TiDB 仍然不会选择 MPP 模式。
>
> 如果由于代价估算之外的原因导致 TiDB 优化器无法选择 MPP,在你使用 `EXPLAIN` 语句查看执行计划时,会返回警告说明原因,例如:
>
> {{< copyable "sql" >}}
>
> ```sql
> set @@session.tidb_enforce_mpp=1;
> create table t(a int);
> explain select count(*) from t;
> show warnings;
> ```
>
> ```
> +---------+------+-----------------------------------------------------------------------------+
> | Level | Code | Message |
> +---------+------+-----------------------------------------------------------------------------+
> | Warning | 1105 | MPP mode may be blocked because there aren't tiflash replicas of table `t`. |
> +---------+------+-----------------------------------------------------------------------------+
> ```

### MPP 模式的算法支持

MPP 模式目前支持的物理算法有:Broadcast Hash Join、Shuffled Hash Join、 Shuffled Hash Aggregation、Union All、 TopN 和 Limit。算法的选择由优化器自动判断。通过 `EXPLAIN` 语句可以查看具体的查询执行计划。如果 `EXPLAIN` 语句的结果中出现 ExchangeSender 和 ExchangeReceiver 算子,表明 MPP 已生效。

以 TPC-H 测试集中的表结构为例:
Expand Down

0 comments on commit a5fd0f7

Please sign in to comment.