Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update explain and execution summary related docs #19229

Merged
merged 12 commits into from
Dec 13, 2024
11 changes: 8 additions & 3 deletions explain-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ Records: 2 Duplicates: 0 Warnings: 0

TiDB 会汇聚 TiKV/TiFlash 上扫描的数据或者计算结果,这种“数据汇聚”算子目前有如下几类:

- **TableReader**:将 TiKV 上底层扫表算子 TableFullScan 或 TableRangeScan 得到的数据进行汇总
- **TableReader**:将 TiKV 或 TiFlash 上底层算子得到的数据进行汇总
- **IndexReader**:将 TiKV 上底层扫表算子 IndexFullScan 或 IndexRangeScan 得到的数据进行汇总。
- **IndexLookUp**:先汇总 Build 端 TiKV 扫描上来的 RowID,再去 Probe 端上根据这些 `RowID` 精确地读取 TiKV 上的数据。Build 端是 `IndexFullScan` 或 `IndexRangeScan` 类型的算子,Probe 端是 `TableRowIDScan` 类型的算子。
- **IndexMerge**:和 `IndexLookupReader` 类似,可以看做是它的扩展,可以同时读取多个索引的数据,有多个 Build 端,一个 Probe 端。执行过程也很类似,先汇总所有 Build 端 TiKV 扫描上来的 RowID,再去 Probe 端上根据这些 RowID 精确地读取 TiKV 上的数据。Build 端是 `IndexFullScan` 或 `IndexRangeScan` 类型的算子,Probe 端是 `TableRowIDScan` 类型的算子。
Expand Down Expand Up @@ -174,9 +174,14 @@ Build 总是先于 Probe 执行,并且 Build 总是出现在 Probe 前面。

### Task 简介

目前 TiDB 的计算任务分为两种不同的 task:cop task 和 root task。Cop task 是指使用 TiKV 中的 Coprocessor 执行的计算任务,root task 是指在 TiDB 中执行的计算任务
目前 TiDB 的计算任务分为四种不同的 task:root task, cop task, batchCop task 和 MPP task

SQL 优化的目标之一是将计算尽可能地下推到 TiKV 中执行。TiKV 中的 Coprocessor 能支持大部分 SQL 内建函数(包括聚合函数和标量函数)、SQL `LIMIT` 操作、索引扫描和表扫描。
- root task 是指在 TiDB 中执行的计算任务。
- cop task 是指使用 TiKV 或 TiFlash 中的 Coprocessor 执行的计算任务。
- batchCop task 是对 TiFlash cop task 的一种优化,可以在一个任务中执行对多个 Region 的查询。
- MPP task 是指利用 TiFlash 的 [MPP 模式](/explain-mpp.md)执行查询。

SQL 优化的目标之一是将计算尽可能地下推到 TiKV 或 TiFlash 中执行,以提高查询效率。TiKV 中的 Coprocessor 支持大部分 SQL 内建函数(包括聚合函数和标量函数)、`LIMIT` 操作、索引扫描和表扫描。TiFlash 中的 Coprocessor 与 TiKV 功能类似,但不支持索引扫描。

### `operator info` 结果

Expand Down
22 changes: 17 additions & 5 deletions sql-statements/sql-statement-explain-analyze.md
Original file line number Diff line number Diff line change
Expand Up @@ -38,10 +38,10 @@ ExplainableStmt ::=

| 属性名 | 含义 |
|:----------------|:---------------------------------|
| actRows | 算子实际输出的数据条数。 |
| execution info | 算子的实际执行信息。time 表示从进入算子到离开算子的全部 wall time,包括所有子算子操作的全部执行时间。如果该算子被父算子多次调用 (loops),这个时间就是累积的时间。loops 是当前算子被父算子调用的次数。 |
| memory | 算子占用内存空间的大小。 |
| disk | 算子占用磁盘空间的大小。 |
| `actRows` | 算子实际输出的数据条数。 |
| `execution info` | 算子的实际执行信息。`time` 表示从进入算子到离开算子的全部 `wall time`,包括所有子算子操作的全部执行时间。如果该算子被父算子多次调用 (`loops`),这个时间就是累积的时间。`loops` 是当前算子被父算子调用的次数。`open` 表示算子初始化所需的时间。`close` 表示从算子处理完所有数据到算子结束执行的时间。其中 `time` 统计的时间包含 `open` 和 `close` 的时间。当算子存在多并发执行情况时,`execution info` 中显示的是各个并发使用的 `wall time` 求和后的结果,此时 `time`、`open` 和 `close` 会被替换为 `total_time`, `total_open` 和 `total_close`。|
| `memory` | 算子占用的最大内存空间。 |
| `disk` | 算子占用的最大磁盘空间。 |

## 示例

Expand Down Expand Up @@ -99,7 +99,7 @@ EXPLAIN ANALYZE SELECT * FROM t1;

## 算子执行信息介绍

`execution info` 信息除了基本的 `time` 和 `loop` 信息外,还包含算子特有的执行信息,主要包含了该算子发送 RPC 请求的耗时信息以及其他步骤的耗时。
`execution info` 信息除了基本的 `time`、`open`、`close` 和 `loop` 信息外,还包含算子特有的执行信息,主要包含了该算子发送 RPC 请求的耗时信息以及其他步骤的耗时。

### Point_Get

Expand Down Expand Up @@ -339,6 +339,18 @@ after key/value request is processed:

对于 writes 和 batch gets,计算方法相似,只是基础成本不同。

### tiflash_wait 信息

当查询涉及到 MPP task 时,执行时间将受到各类 `tiflash_wait` 时间的影响,示例如下:

```
tiflash_wait: {minTSO_wait: 425ms, pipeline_breaker_wait: 133ms, pipeline_queue_wait: 512ms}
```

- `minTSO_wait`:记录 MPP Task 等待被 [TiFlash MinTSO 调度器](/tiflash/tiflash-mintso-scheduler.md)调度花费的时间。
- `pipeline_breaker_wait`:当 TiFlash 采用 [Pipeline 执行模型](/tiflash/tiflash-pipeline-model.md)时,记录包含 pipeline breaker 算子的 pipeline 等待上游 pipeline 所有数据花费的时间。目前仅用来展示包含 `Join` 算子的 pipeline 等待所有哈希表 build 完成花费的时间。
- `pipeline_queue_wait`:当 TiFlash 采用 [Pipeline 执行模型](/tiflash/tiflash-pipeline-model.md)时,记录 pipeline 执行过程中,在 CPU Task Thread Pool 和 IO Task Thread Pool 中等待的时间。

### 其它常见执行信息

Coprocessor 算子通常包含 `cop_task` 和 `tikv_task` 两部分执行时间信息。前者是 TiDB 端记录的时间,从发出请求到接收回复;后者是 TiKV Coprocessor 算子自己记录的时间。两者相差较大可能说明在等待、gRPC 或网络上耗时较长。
Expand Down
2 changes: 1 addition & 1 deletion sql-statements/sql-statement-explain.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ ExplainableStmt ::=
|:----------------|:----------------------------------------------------------------------------------------------------------|
| id | 算子的 ID,是算子在整个执行计划中唯一的标识。在 TiDB 2.1 中,ID 会格式化地显示算子的树状结构。数据从孩子结点流向父亲结点,每个算子的父亲结点有且仅有一个。|
| estRows | 算子预计将会输出的数据条数,基于统计信息以及算子的执行逻辑估算而来。在 4.0 之前叫 count。 |
| task | 算子属于的 task 种类。目前的执行计划分成为两种 task,一种叫 **root** task,在 tidb-server 上执行,一种叫 **cop** task,在 TiKV 或者 TiFlash 上并行执行。当前的执行计划在 task 级别的拓扑关系是一个 root task 后面可以跟许多 cop task,root task 使用 cop task 的输出结果作为输入。cop task 中执行的也即是 TiDB 下推到 TiKV 或者 TiFlash 上的任务,每个 cop task 分散在 TiKV 或者 TiFlash 集群中,由多个进程共同执行。 |
| task | 算子属于的 task 类型。目前的执行计划可以分为以下四种 task**root** task,在 tidb-server 上执行**cop** task,在 TiKV 或者 TiFlash 上并行执行;**batchCop** task,在 TiFlash 上并行执行;**MPP** task,在 TiFlash 上并行执行。当前的执行计划在 task 级别的拓扑关系是一个 root task 后面可以跟许多其他类型的 task,root task 使用其他类型 task 的输出结果作为输入。其他类型 task 中执行的也即是 TiDB 下推到 TiKV 或者 TiFlash 上的任务,每个 task 分散在 TiKV 或者 TiFlash 集群中,由多个进程共同执行。 |
| access object | 算子所访问的数据项信息。包括表 `table`,表分区 `partition` 以及使用的索引 `index`(如果有)。只有直接访问数据的算子才拥有这些信息。 |
| operator info | 算子的其它信息。各个算子的 operator info 各有不同,可参考下面的示例解读。 |

Expand Down
Loading