# 分散 SQL 操作

__*Distributed SQL*__

+ 分散`SQL` vs. `TiKV`

```8
tidb> SELECT ~!@COUNT(*)@!~ FROM universe.planets
   -> WHERE category_id = 1;

tidb> EXPLAIN SELECT COUNT(*) FROM universe.planets WHERE category_id = 1;
+------------------------------+-----------+-----------+---------------+-------------------------------------+
| id                           | estRows   | task      | access object | operator info                       |
+------------------------------+-----------+-----------+---------------+-------------------------------------+
| StreamAgg_20                 | 1.00      | root      |               | funcs:count(Column#27)->Column#25   |
| └─TableReader_21             | 1.00      | root      |               | data:StreamAgg_9                    |
|   └─StreamAgg_9              | 1.00      | ~!@cop[tikv] |               | funcs:count(1)->Column#27@!~           |
|     └─Selection_19           | 163.84    | ~!@cop[tikv] |               | eq(universe.planets.category_id, 1)@!~ |
|       └─TableFullScan_18     | 163840.00 | ~!@cop[tikv] | table:planets | keep order:false, stats:pseudo@!~      |
+------------------------------+-----------+-----------+---------------+-------------------------------------+
5 rows in set (0.00 sec)
```
-------------------------------------------------------------
できるだけコンピュートをストレージノードに近づけ、多数の RPC 呼び出しを避けるために、まず、SQL の述語条件 `name = "TiDB"` をストレージノードにプッシュダウンして計算を行い、有効な行のみを返し、意味のないネットワーク転送を避けます。そして、集計関数 `COUNT(*)` もストレージノードにプッシュダウンしてプリ集計を行い、各ノードは 1 つの `COUNT(*)` 結果を返すだけでよいです。各ノードが返す結果は SQL レイヤーによって `COUNT(*)` が合算されます。