Skip to content
8 changes: 4 additions & 4 deletions control-execution-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ category: performance

# 控制执行计划

Sub topics:
SQL 性能调优的前两个章节介绍了如何理解 TiDB 的执行计划以及 TiDB 如何生成一个执行计划。本章节将介绍当你确定了执行计划所存在的问题时,可以使用哪些手段来控制执行计划的生成。本章节主要包括以下三方面内容:

- [Optimizer Hints](/optimizer-hints.md)
- [执行计划绑定](/execution-plan-binding.md)
- [优化规则及表达式下推的黑名单](/blacklist-control-plan.md)
- [Optimizer Hints](/optimizer-hints.md)中,我们会介绍如何使用 Hint 来指导 TiDB 生成执行计划。
- 但是使用 Hint 会侵入性地更改 SQL,在一些场景下并不能简单的插入 Hint。在[执行计划绑定](/execution-plan-binding.md)中,我们会介绍 TiDB 如何使用另一种语法来非侵入地控制执行计划的生成,同时还会介绍后台自动对执行计划进行演进的手段,来减轻诸如版本升级等原因造成的执行计划不稳定,而导致集群性能下降的问题。
- 最后在[优化规则及表达式下推的黑名单](/blacklist-control-plan.md)中,我们会介绍黑名单的使用。
Binary file added media/sql-optimization.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
4 changes: 2 additions & 2 deletions query-execution-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ aliases: ['/docs-cn/dev/reference/performance/understanding-the-query-execution-

# 理解 TiDB 执行计划

TiDB 优化器会根据当前数据表的实际情况来选择最优的执行计划,执行计划由一系列的算子构成。本文将详细解释 TiDB 中 `EXPLAIN` 语句返回的执行计划信息
TiDB 优化器会根据当前数据表的最新的统计信息来选择最优的执行计划,执行计划由一系列的算子构成。本文将详细解释 TiDB 中的执行计划

## EXPLAIN 简介

`EXPLAIN` 语句的返回结果提供了 TiDB 执行 SQL 查询的详细信息:
TiDB 中可以使用 `EXPLAIN` 命令来查看执行计划,`EXPLAIN` 语句的返回结果提供了 TiDB 执行 SQL 查询的详细信息:

- `EXPLAIN` 可以和 `SELECT`,`DELETE` 等语句一起使用;
- 执行 `EXPLAIN`,TiDB 会返回被 `EXPLAIN` 的 SQL 语句经过优化器后的最终物理执行计划。也就是说,`EXPLAIN` 展示了 TiDB 执行该 SQL 语句的完整信息,比如以什么样的顺序,什么方式 JOIN 两个表,表达式树长什么样等等。
Expand Down
6 changes: 4 additions & 2 deletions sql-logical-optimization.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ category: performance

# 逻辑优化

sub topics:
本章节将对一些比较关键的逻辑改写进行说明,帮助大家理解 TiDB 如何生成最终的查询计划。比如在 TiDB 输入 `select * from t where t.a in (select * from t1 where t1.b=t.b)` 这个查询时,在最终的执行计划中将看不到这个 `t.a in (select t1.a from t1 where t1.b=t.b` 这个 `IN` 子查询的存在,这便是因为 TiDB 对这里进行了一些改写。

本章节会介绍如下几个关键改写:

- [子查询相关的优化](/subquery-optimization.md)
- [列裁剪](/column-pruning.md)
Expand All @@ -14,4 +16,4 @@ sub topics:
- [谓词下推](/predicate-push-down.md)
- [分区裁剪](/partition-pruning.md)
- [TopN 和 Limit 下推](/topn-limit-push-down.md)
- [Join Reorder](/join-reorder.md)
- [Join Reorder](/join-reorder.md)
36 changes: 5 additions & 31 deletions sql-optimization-concepts.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,38 +6,12 @@ aliases: ['/docs-cn/dev/reference/performance/sql-optimizer-overview/']

# SQL 优化流程简介

sub topics:
在 TiDB 中,从输入的查询文本到最终的执行计划执行结果的过程可以见下图。

- [逻辑优化](/sql-logical-optimization.md)
- [物理优化](/sql-physical-optimization.md)
- [执行计划缓存](/sql-prepare-plan-cache.md)
![SQL Optimization](/media/sql-optimization.png)

<!--
在 TiDB 中,SQL 优化过程分为逻辑优化和物理优化两个阶段。
在经过了 `parser` 对原始查询文本的解析以及一些简单的合法性验证后,TiDB 首先会对查询做一些逻辑上的等价变化,详细的变化可以查询[逻辑优化](/sql-logical-optimization.md)章节。

## 逻辑优化简介
通过这些等价变化,使得这个查询在逻辑执行计划上可以变得更易于处理。在等价变化结束之后,TiDB 会得到一个与原始查询等价的查询计划结构,之后根据数据分布、以及一个算子具体的执行开销,来获得一个最终的执行计划,这部分内容可以查询[物理优化](/sql-physical-optimization.md)章节。

逻辑优化是基于规则的优化,对输入的逻辑执行计划按顺序应用一些优化规则,从而使整个逻辑执行计划变得更好。这些优化规则包括:

- [子查询相关的优化](./subquery-optimization.md)
- [列裁剪](./column-pruning.md)
- [关联子查询去关联](./correlated-subquery-optimization.md)
- [Max/Min 消除](/max-min-eliminate.md)
- [谓词下推](./predicate-push-down.md)
- [分区裁剪](./partition-pruning.md)
- [TopN 和 Limit 下推](./topn-limit-push-down.md)
- [Join Reorder](/join-reorder.md)

## 物理优化简介

物理优化是基于代价的优化,为上一阶段产生的逻辑执行计划制定物理执行计划。这一阶段中,优化器会为逻辑执行计划中的每个算子选择具体的物理实现。逻辑算子的不同物理实现有着不同的时间复杂度、资源消耗和物理属性等。在这个过程中,优化器会根据数据的统计信息来确定不同物理实现的代价,并选择整体代价最小的物理执行计划。

逻辑执行计划是一个树形结构,每个节点对应 SQL 中的一个逻辑算子。同样的,物理执行计划也是一个树形结构,每个节点对应 SQL 中的一个物理算子。逻辑算子只描述这个算子的功能,而物理算子则描述了完成这个功能的具体算法。对于同一个逻辑算子,可能有多个物理算子实现,比如 `LogicalAggregate`,它的实现可以是采用哈希算法的 `HashAggregate`,也可以是流式的 `StreamAggregate`。不同的物理算子具有不同的物理属性,也对其子节点有着不同的物理属性的要求。物理属性包括数据的顺序和分布等。TiDB 中现在只考虑了数据的顺序。

sub topics:

- [索引的选择](./index-choose.md)
- [统计信息介绍](./statistics-intro.md)
- [发现索引选错时](./wrong-index-solution.md)
- [Distinct 优化](./agg-distinct-optimization.md)
-->
同时,TiDB 在执行 [`PREPARE`](/sql-statements/sql-statement-prepare.md) 语句时,可以选择开启缓存来降低 TiDB 生成执行计划的开销,这部分内容会在[执行计划缓存](/sql-prepare-plan-cache.md)一节中介绍。
12 changes: 7 additions & 5 deletions sql-physical-optimization.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,11 @@ category: performance

# 物理优化

sub topics:
物理优化是基于代价的优化,为上一阶段产生的逻辑执行计划制定物理执行计划。这一阶段中,优化器会为逻辑执行计划中的每个算子选择具体的物理实现。逻辑算子的不同物理实现有着不同的时间复杂度、资源消耗和物理属性等。在这个过程中,优化器会根据数据的统计信息来确定不同物理实现的代价,并选择整体代价最小的物理执行计划。

- [索引的选择](/index-choose.md)
- [统计信息简介](/statistics.md)
- [错误索引的解决方案](/wrong-index-solution.md)
- [Distinct 优化](/agg-distinct-optimization.md)
[理解 TiDB 执行计划](/query-execution-plan.md) 文档已对每个物理算子进行了一些介绍。在本章我们会重点介绍以下方面:

- 在[索引的选择](/index-choose.md)中会介绍 TiDB 在一张表有多个索引时,如何选择最优的索引进行表的访问。
- 在[统计信息简介](/statistics.md)中会介绍 TiDB 收集了哪些统计信息来获得表的数据分布情况
- 在[错误索引的解决方案](/wrong-index-solution.md)中会介绍当发现 TiDB 索引选错时,你应该使用那些手段来让它使用正确的索引
- 在 [Distinct 优化](/agg-distinct-optimization.md)中会介绍在物理优化中会做的一个有关 `DISTINCT` 关键字的优化,在这一小节中会介绍它的优缺点以及如何使用它。
10 changes: 5 additions & 5 deletions sql-tuning-overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ title: SQL 性能调优
category: performance
---

# SQL 调优概览
# SQL 性能调优

Sub Topics:
在上一章节”故障诊断“中,介绍了可以通过一些手段定位到对集群造成影响的一些查询,或是 DBA 主动发现某些查询的执行时间不符合原本的预期,这时就需要对查询的执行情况进行分析。在本章中主要有以下三个部分,介绍了如何针对一个具体的查询进行调优:

- [理解 TiDB 执行计划](/query-execution-plan.md)
- [SQL 优化流程简介](/sql-optimization-concepts.md)
- [控制执行计划](/control-execution-plan.md)
- 第一部分[理解 TiDB 执行计划](/query-execution-plan.md)中,会介绍如何使用 `EXPLAIN` 以及 `EXPLAIN ANALYZE` 语句来理解 TiDB 是如何执行某个查询的。
- 第二部分[SQL 优化流程简介](/sql-optimization-concepts.md)中,会介绍 TiDB 内部会使用的优化,其中会涉及一些等价的 SQL 变换以及物理计划的选择,来方便读者理解 TiDB 是如何生成最终的执行计划的。
- 第三部分[控制执行计划](/control-execution-plan.md)中,会介绍如何通过一些手段来控制执行计划的生成来提升查询的执行速度,减少它对集群整体性能或者业务的影响情况。