From 8f3189deee4cf0517565c132c1643c0163358650 Mon Sep 17 00:00:00 2001 From: Han Fei Date: Wed, 24 Mar 2021 13:57:37 +0800 Subject: [PATCH] write document for mpp (#5702) --- system-variables.md | 18 ++++++++++++++++++ tiflash/use-tiflash.md | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/system-variables.md b/system-variables.md index b8a8c7742ccc..59dd31a22349 100644 --- a/system-variables.md +++ b/system-variables.md @@ -171,6 +171,12 @@ mysql> SELECT * FROM t1; * 1:aggregation 和 join 的请求会进行批量发送 * 2:所有的 cop 请求都会批量发送 +### `tidb_allow_mpp` 从 v5.0 GA 版本开始引入 + +- 作用域:SESSION | GLOBAL +- 默认值:ON(表示开启) +- 这个变量用于控制是否使用 TiFlash 的 MPP 模式执行查询。开启后 TiDB 会通过优化器自动判断是否选择 MPP 执行。MPP 是 TiFlash 引擎提供的分布式计算框架,允许节点之间的数据交换并提供高性能、高吞吐的 SQL 算法。 + ### `tidb_allow_remove_auto_inc` 从 v2.1.18 和 v3.0.4 版本开始引入 - 作用域:SESSION @@ -221,6 +227,18 @@ mysql> SELECT * FROM t1; 在网络环境较差的情况下,适当增大该变量值可以有效缓解因为超时而向应用端报错的情况;而如果应用端希望更快地接到报错信息,则应该尽量减小该变量的值。 +### `tidb_broadcast_join_threshold_count` 从 v5.0 GA 版本开始引入 + +- 作用域:SESSION | GLOBAL +- 默认值:10240 +- 单位为行数。如果 join 的对象为子查询,优化器无法估计子查询结果集大小,在这种情况下通过结果集行数判断。如果子查询的行数估计值小于该变量,则选择 Broadcast Hash Join 算法。否则选择 Shuffled Hash Join 算法。 + +### `tidb_broadcast_join_threshold_size` 从 v5.0 GA 版本开始引入 + +- 作用域:SESSION | GLOBAL +- 默认值:104857600(表示 100 兆) +- 如果表大小(字节数)小于该值,则选择 Broadcast Hash Join 算法。否则选择 Shuffled Hash Join 算法。 + ### `tidb_build_stats_concurrency` - 作用域:SESSION diff --git a/tiflash/use-tiflash.md b/tiflash/use-tiflash.md index 02bfae166d65..d9ed3574b9be 100644 --- a/tiflash/use-tiflash.md +++ b/tiflash/use-tiflash.md @@ -244,3 +244,44 @@ round without fraction, cast(int as decimal), date_add(datetime, int), date_add( - 在聚合函数或者 WHERE 条件中包含了不在上述列表中的表达式,聚合或者相关的谓词过滤均不能下推 如查询遇到不支持的下推计算,则需要依赖 TiDB 完成剩余计算,可能会很大程度影响 TiFlash 加速效果。对于暂不支持的表达式,将会在后续陆续加入支持,也可以联系官方沟通。 + +## 使用 MPP 模式 + +TiFlash 支持 MPP 模式的查询执行,即在计算中引入跨节点的数据交换(data shuffle 过程)。MPP 模式默认开启,如需关闭可将全局/会话变量 [`tidb_allow_mpp`](/system-variables.md#tidb_allow_mpp-从-v50-ga-版本开始引入) 的值设为 `0` 或 `OFF`: + +```shell +set @@session.tidb_allow_mpp=0 +``` + +MPP 模式目前支持的物理算法有:Broadcast Hash Join、Shuffled Hash Join 和 Shuffled Hash Aggregation。算法的选择由优化器自动判断。通过 `EXPLAIN` 语句可以查看具体的查询执行计划。 + +以 TPC-H 测试集中的表结构为例: + +```sql +mysql> explain select count(*) from customer c join nation n on c.c_nationkey=n.n_nationkey; ++------------------------------------------+------------+-------------------+---------------+----------------------------------------------------------------------------+ +| id | estRows | task | access object | operator info | ++------------------------------------------+------------+-------------------+---------------+----------------------------------------------------------------------------+ +| HashAgg_23 | 1.00 | root | | funcs:count(Column#16)->Column#15 | +| └─TableReader_25 | 1.00 | root | | data:ExchangeSender_24 | +| └─ExchangeSender_24 | 1.00 | batchCop[tiflash] | | ExchangeType: PassThrough | +| └─HashAgg_12 | 1.00 | batchCop[tiflash] | | funcs:count(1)->Column#16 | +| └─HashJoin_17 | 3000000.00 | batchCop[tiflash] | | inner join, equal:[eq(tpch.nation.n_nationkey, tpch.customer.c_nationkey)] | +| ├─ExchangeReceiver_21(Build) | 25.00 | batchCop[tiflash] | | | +| │ └─ExchangeSender_20 | 25.00 | batchCop[tiflash] | | ExchangeType: Broadcast | +| │ └─TableFullScan_18 | 25.00 | batchCop[tiflash] | table:n | keep order:false | +| └─TableFullScan_22(Probe) | 3000000.00 | batchCop[tiflash] | table:c | keep order:false | ++------------------------------------------+------------+-------------------+---------------+----------------------------------------------------------------------------+ +9 rows in set (0.00 sec) +``` + +在执行计划中,出现了 `ExchangeReceiver` 和 `ExchangeSender` 算子。该执行计划表示 `nation` 表读取完毕后,经过 `ExchangeSender` 算子广播到各个节点中,与 `customer` 表先后进行 `HashJoin` 和 `HashAgg` 操作,再将结果返回至 TiDB 中。 + +> **注意:** +> +> MPP 模式默认不支持分区表。 + +TiFlash 提供了两个全局/会话变量决定是否选择 Broadcast Hash Join,分别为: + +- [`tidb_broadcast_join_threshold_size`](/system-variables.md#tidb_broadcast_join_threshold_count-从-v50-ga-版本开始引入),单位为 bytes。如果表大小(字节数)小于该值,则选择 Broadcast Hash Join 算法。否则选择 Shuffled Hash Join 算法。 +- [`tidb_broadcast_join_threshold_count`](/system-variables.md#tidb_broadcast_join_threshold_count-从-v50-ga-版本开始引入),单位为行数。如果 join 的对象为子查询,优化器无法估计子查询结果集大小,在这种情况下通过结果集行数判断。如果子查询的行数估计值小于该变量,则选择 Broadcast Hash Join 算法。否则选择 Shuffled Hash Join 算法。