使用 MPP 模式

    TiFlash 支持 MPP 模式的查询执行,即在计算中引入跨节点的数据交换(data shuffle 过程)。TiDB 默认由优化器自动选择是否使用 MPP 模式,你可以通过修改变量 tidb_allow_mpp 和 的值来更改选择策略。

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

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

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

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

    1. set @@session.tidb_allow_mpp=1;
    2. set @@session.tidb_enforce_mpp=0;

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

    注意

    tidb_enforce_mpp=1 在生效时,TiDB 优化器会忽略代价估算选择 MPP 模式。但如果存在其它不支持 MPP 的因素,例如没有 TiFlash 副本、TiFlash 副本同步未完成、语句中含有 MPP 模式不支持的算子或函数等,那么 TiDB 仍然不会选择 MPP 模式。

    如果由于代价估算之外的原因导致 TiDB 优化器无法选择 MPP,在你使用 EXPLAIN 语句查看执行计划时,会返回警告说明原因,例如:

    1. set @@session.tidb_enforce_mpp=1;
    2. create table t(a int);
    3. explain select count(*) from t;

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

    1. mysql> explain select count(*) from customer c join nation n on c.c_nationkey=n.n_nationkey;
    2. +------------------------------------------+------------+-------------------+---------------+----------------------------------------------------------------------------+
    3. | id | estRows | task | access object | operator info |
    4. +------------------------------------------+------------+-------------------+---------------+----------------------------------------------------------------------------+
    5. | HashAgg_23 | 1.00 | root | | funcs:count(Column#16)->Column#15 |
    6. | └─TableReader_25 | 1.00 | root | | data:ExchangeSender_24 |
    7. | └─ExchangeSender_24 | 1.00 | batchCop[tiflash] | | ExchangeType: PassThrough |
    8. | └─HashAgg_12 | 1.00 | batchCop[tiflash] | | funcs:count(1)->Column#16 |
    9. | └─ExchangeSender_20 | 25.00 | batchCop[tiflash] | | ExchangeType: Broadcast |
    10. | └─TableFullScan_18 | 25.00 | batchCop[tiflash] | table:n | keep order:false |
    11. | └─TableFullScan_22(Probe) | 3000000.00 | batchCop[tiflash] | table:c | keep order:false |
    12. +------------------------------------------+------------+-------------------+---------------+----------------------------------------------------------------------------+
    13. 9 rows in set (0.00 sec)

    在执行计划中,出现了 ExchangeReceiverExchangeSender 算子。该执行计划表示 nation 表读取完毕后,经过 ExchangeSender 算子广播到各个节点中,与 customer 表先后进行 HashJoin 和 操作,再将结果返回至 TiDB 中。

    TiFlash 提供了两个全局/会话变量决定是否选择 Broadcast Hash Join,分别为:

    • tidb_broadcast_join_threshold_size,单位为 bytes。如果表大小(字节数)小于该值,则选择 Broadcast Hash Join 算法。否则选择 Shuffled Hash Join 算法。
    • ,单位为行数。如果 join 的对象为子查询,优化器无法估计子查询结果集大小,在这种情况下通过结果集行数判断。如果子查询的行数估计值小于该变量,则选择 Broadcast Hash Join 算法。否则选择 Shuffled Hash Join 算法。

    如果希望使用 MPP 模式访问分区表,需要先开启。

    示例如下: