# 分布式 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(*)`也可以被下推到存储节点进行预聚合，每个节点只需要返回一个`COUNT(*)`的结果即可，每个节点返回的结果都是SQL层求和的COUNT(*)。

