# `TiFlash MPP` Operators in the Execution Plan

+ `ExchangeSender`: This operator sends rows with the same hash value of the `hire_date` column to the same TiFlash node.
+ `ExchangeReceiver`: This operator receives the rows that were sent by the `ExchangeSender` to ensure they are correctly placed on the appropriate TiFlash node.

```
EXPLAIN SELECT COUNT(*) FROM emp GROUP BY hire_date;
+--------------------------+-----------+--------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
| id                       | estRows   | task         | access object | operator info                                                                                                                |
+--------------------------+-----------+--------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
| TableReader_44           | 5434.00   | root         |               | MppVersion: 1, data:ExchangeSender_43                                                                                        |
| └─ExchangeSender_43      | 5434.00   | ~!@mpp[tiflash]@!~ |               | ExchangeType: PassThrough                                                                                                    |
|  └─Projection_39         | 5434.00   | ~!@mpp[tiflash]@!~ |               | Column#7                                                                                                                     |
|   └─HashAgg_40           | 5434.00   | ~!@mpp[tiflash]@!~ |               | group by:employees.emp.hire_date, funcs:sum(Column#11)->Column#7, stream_count: 2                                            |
|    └─ExchangeReceiver_42 | 5434.00   | ~!@mpp[tiflash]@!~ |               | stream_count: 2                                                                                                              |
|     └─ExchangeSender_41  | 5434.00   | ~!@mpp[tiflash]@!~ |               | ExchangeType: HashPartition, Compression: FAST, Hash Cols: [name: employees.emp.hire_date, collate: binary],stream_count: 2  |
|      └─HashAgg_37        | 5434.00   | ~!@mpp[tiflash]@!~ |               | group by:employees.emp.hire_date, funcs:count(1)->Column#11                                                                  |
|       └─TableFullScan_26 | 300024.00 | ~!@mpp[tiflash]@!~ |   table:emp   | keep order:false                                                                                                             |
+--------------------------+-----------+--------------+---------------+------------------------------------------------------------------------------------------------------------------------------+
8 rows in set (0.02 sec)
```

------------------------------------------------------------------------------
Here’s an introduction to two key operators in the MPP architecture: `ExchangeSender` and `ExchangeReceiver`.

- `ExchangeSender`: This operator sends rows with the same hash value of the `hire_date` column to the same TiFlash node. 

- `ExchangeReceiver`: This operator receives the rows that were sent by the `ExchangeSender` to ensure they are correctly placed on the appropriate TiFlash node.

These operators work together to ensure data is efficiently distributed and aggregated across the nodes.