From 47fc6555f48e4bc9fa34393116d023018b51b417 Mon Sep 17 00:00:00 2001 From: Keke Yi <40977455+yikeke@users.noreply.github.com> Date: Mon, 3 Aug 2020 13:53:40 +0800 Subject: [PATCH 1/2] cherry pick #3392 to release-4.0 Signed-off-by: ti-srebot --- TOC.md | 7 +- control-execution-plan.md | 11 ++ credits.md | 180 ++++++++++++++++++ media/sql-optimization.png | Bin 0 -> 70391 bytes ...tes-push-down.md => predicate-push-down.md | 1 + sql-logical-optimization.md | 18 ++ sql-optimization-concepts.md | 27 +-- sql-physical-optimization.md | 14 ++ sql-statements/sql-statement-add-index.md | 2 + sql-statements/sql-statement-create-index.md | 2 + sql-tuning-overview.md | 11 ++ ticdc/troubleshoot-ticdc.md | 2 +- 12 files changed, 251 insertions(+), 24 deletions(-) create mode 100644 control-execution-plan.md create mode 100644 credits.md create mode 100644 media/sql-optimization.png rename predicates-push-down.md => predicate-push-down.md (99%) create mode 100644 sql-logical-optimization.md create mode 100644 sql-physical-optimization.md create mode 100644 sql-tuning-overview.md diff --git a/TOC.md b/TOC.md index 45dfc3faa079d..ef6ac4b246b80 100644 --- a/TOC.md +++ b/TOC.md @@ -11,6 +11,7 @@ + [Basic Features](/basic-features.md) + [MySQL Compatibility](/mysql-compatibility.md) + [TiDB Limitations](/tidb-limitations.md) + + [Credits](/credits.md) + Quick Start + [Try Out TiDB](/quick-start-with-tidb.md) + [Learn TiDB SQL](/basic-sql-operations.md) @@ -104,25 +105,29 @@ + [TiFlash Tuning](/tiflash/tune-tiflash-performance.md) + [Coprocessor Cache](/coprocessor-cache.md) + SQL Tuning + + [Overview](/sql-tuning-overview.md) + [SQL Tuning with `EXPLAIN`](/query-execution-plan.md) + SQL Optimization + [SQL Optimization Process](/sql-optimization-concepts.md) + Logic Optimization + + [Overview](/sql-logical-optimization.md) + [Subquery Related Optimizations](/subquery-optimization.md) + [Column Pruning](/column-pruning.md) + [Decorrelation of Correlated Subquery](/correlated-subquery-optimization.md) + [Eliminate Max/Min](/max-min-eliminate.md) - + [Predicates Push Down](/predicates-push-down.md) + + [Predicates Push Down](/predicate-push-down.md) + [Partition Pruning](/partition-pruning.md) + [TopN and Limit Push Down](/topn-limit-push-down.md) + [Join Reorder](/join-reorder.md) + Physical Optimization + + [Overview](/sql-physical-optimization.md) + [Index Selection](/choose-index.md) + [Statistics](/statistics.md) + [Wrong Index Solution](/wrong-index-solution.md) + [Distinct Optimization](/agg-distinct-optimization.md) + [Prepare Execution Plan Cache](/sql-prepare-plan-cache.md) + Control Execution Plan + + [Overview](/control-execution-plan.md) + [Optimizer Hints](/optimizer-hints.md) + [SQL Plan Management](/sql-plan-management.md) + [The Blocklist of Optimization Rules and Expression Pushdown](/blocklist-control-plan.md) diff --git a/control-execution-plan.md b/control-execution-plan.md new file mode 100644 index 0000000000000..4c09a9f84dbb8 --- /dev/null +++ b/control-execution-plan.md @@ -0,0 +1,11 @@ +--- +title: Control Execution Plan +--- + +# Control Execution Plan + +The first two chapters of SQL Tuning introduce how to understand TiDB's execution plan and how TiDB generates an execution plan. This chapter introduces what methods can be used to control the generation of the execution plan when you determine the problems with the execution plan. This chapter mainly includes the following three aspects: + +- In [Optimizer Hints](/optimizer-hints.md), you will learn how to use hints to guide TiDB to generate an execution plan. +- But hints change the SQL statement intrusively. In some scenarios, hints cannot be simply inserted. In [SQL Plan Management](/sql-plan-management.md), you will know how TiDB uses another syntax to non-intrusively control the generation of execution plans, and the methods of automatic execution plan evolution in the background to alleviate the execution plan instability caused by reasons such as version upgrades, which degrades cluster performance. +- Finally, you will learn how to use the blocklist in [Blocklist of Optimization Rules and Expression Pushdown](/blocklist-control-plan.md). \ No newline at end of file diff --git a/credits.md b/credits.md new file mode 100644 index 0000000000000..1a8b9a31fedf1 --- /dev/null +++ b/credits.md @@ -0,0 +1,180 @@ +--- +title: Credits +summary: Learn about the list and roles of contributors to the TiDB community. +--- + +# Credits + +The TiDB developer community uses SIG (Special Interest Group) as a unit to manage and organize developers. Each module has its own SIG which is responsible for new feature development, performance optimization, stability guarantee, etc. If you also want to become a TiDB developer, come and join the interested [SIG](https://github.com/pingcap/community/tree/master/special-interest-groups) and discuss directly with other senior developers! As of TiDB 4.0 GA, the following is the list of contributors to the TiDB community and their corresponding roles: + +## Committers + +| SIG name | GitHub ID | +|:--|:--| +|[planner](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-planner)|[winoros](https://github.com/winoros)| +|[transaction](https://github.com/tikv/community/tree/master/sig/transaction)|[jackysp](https://github.com/jackysp)| +|[k8s](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-k8s)|[cofyc](https://github.com/cofyc)| +|[scheduling](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-scheduling)|[rleungx](https://github.com/rleungx)| +|[Dashboard](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-dashboard)|[breeswish](https://github.com/breeswish)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[lilin90](https://github.com/lilin90)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[qw4990](https://github.com/qw4990)| +|[tools](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tools)|[kennytm](https://github.com/kennytm)| +|[tiup](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tiup)|[lonng](https://github.com/lonng)| +|[web](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-web)|[wd0517](https://github.com/wd0517)| +|[ddl](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-ddl)|[zimulala](https://github.com/zimulala)| +|[transaction](https://github.com/tikv/community/tree/master/sig/transaction)|[bobotu](https://github.com/bobotu)| +|[transaction](https://github.com/tikv/community/tree/master/sig/transaction)|[cfzjywxk](https://github.com/cfzjywxk)| +|[transaction](https://github.com/tikv/community/tree/master/sig/transaction)|[lysu](https://github.com/lysu)| +|[transaction](https://github.com/tikv/community/tree/master/sig/transaction)|[tiancaiamao](https://github.com/tiancaiamao)| +|[transaction](https://github.com/tikv/community/tree/master/sig/transaction)|[youjiali1995](https://github.com/youjiali1995)| +|[transaction](https://github.com/tikv/community/tree/master/sig/transaction)|[coocood](https://github.com/coocood)| +|[transaction](https://github.com/tikv/community/tree/master/sig/transaction)|[imtbkcat](https://github.com/imtbkcat)| +|[transaction](https://github.com/tikv/community/tree/master/sig/transaction)|[MyonKeminta](https://github.com/MyonKeminta)| +|[transaction](https://github.com/tikv/community/tree/master/sig/transaction)|[nrc](https://github.com/nrc)| +|[k8s](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-k8s)|[AstroProfundis](https://github.com/AstroProfundis)| +|[k8s](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-k8s)|[aylei](https://github.com/aylei)| +|[k8s](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-k8s)|[DanielZhangQD](https://github.com/DanielZhangQD)| +|[k8s](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-k8s)|[gregwebs](https://github.com/gregwebs)| +|[k8s](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-k8s)|[jlerche](https://github.com/jlerche)| +|[k8s](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-k8s)|[LinuxGit](https://github.com/LinuxGit)| +|[k8s](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-k8s)|[onlymellb](https://github.com/onlymellb)| +|[k8s](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-k8s)|[qiffang](https://github.com/qiffang)| +|[k8s](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-k8s)|[sdojjy](https://github.com/sdojjy)| +|[k8s](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-k8s)|[shuijing198799](https://github.com/shuijing198799)| +|[k8s](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-k8s)|[tennix](https://github.com/tennix)| +|[k8s](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-k8s)|[weekface](https://github.com/weekface)| +|[scheduling](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-scheduling)|[disksing](https://github.com/disksing)| +|[scheduling](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-scheduling)|[hundundm](https://github.com/hundundm)| +|[scheduling](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-scheduling)|[lhy1024](https://github.com/lhy1024)| +|[scheduling](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-scheduling)|[nolouch](https://github.com/nolouch)| +|[scheduling](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-scheduling)|[shafreeck](https://github.com/shafreeck)| +|[Dashboard](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-dashboard)|[crazycs520](https://github.com/crazycs520)| +|[Dashboard](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-dashboard)|[Deardrops](https://github.com/Deardrops)| +|[Dashboard](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-dashboard)|[mapleFU](https://github.com/mapleFU)| +|[Dashboard](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-dashboard)|[reafans](https://github.com/reafans)| +|[Dashboard](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-dashboard)|[rleungx](https://github.com/rleungx)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[CaitinChen](https://github.com/CaitinChen)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[cofyc](https://github.com/cofyc)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[DanielZhangQD](https://github.com/DanielZhangQD)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[dcalvin](https://github.com/dcalvin)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[jackysp](https://github.com/jackysp)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[ran-huang](https://github.com/ran-huang)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[TomShawn](https://github.com/TomShawn)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[toutdesuite](https://github.com/toutdesuite)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[WangXiangUSTC](https://github.com/WangXiangUSTC)| +|[tools](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tools)|[3pointer](https://github.com/3pointer)| +|[tools](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tools)|[5kbpers](https://github.com/5kbpers)| +|[tools](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tools)|[amyangfei](https://github.com/amyangfei)| +|[tools](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tools)|[gmhdbjd](https://github.com/gmhdbjd)| +|[tools](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tools)|[GregoryIan](https://github.com/GregoryIan)| +|[tools](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tools)|[july2993](https://github.com/july2993)| +|[tools](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tools)|[leoppro](https://github.com/leoppro)| +|[tools](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tools)|[lichunzhu](https://github.com/lichunzhu)| +|[tools](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tools)|[overvenus](https://github.com/overvenus)| +|[tools](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tools)|[YuJuncen](https://github.com/YuJuncen)| +|[tiup](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tiup)|[AstroProfundis](https://github.com/AstroProfundis)| +|[tiup](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tiup)|[july2993](https://github.com/july2993)| +|[tiup](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tiup)|[nrc](https://github.com/nrc)| +|[tiup](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tiup)|[birdstorm](https://github.com/birdstorm)| +|[tiup](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tiup)|[breeswish](https://github.com/breeswish)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[Reminiscent](https://github.com/Reminiscent)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[wshwsh12](https://github.com/wshwsh12)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[zz-jason](https://github.com/zz-jason)| +|[web](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-web)|[g1eny0ung](https://github.com/g1eny0ung)| +|[web](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-web)|[YiniXu9506](https://github.com/YiniXu9506)| +|[ddl](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-ddl)|[AilinKid](https://github.com/AilinKid)| +|[ddl](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-ddl)|[bb7133](https://github.com/bb7133)| +|[ddl](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-ddl)|[crazycs520](https://github.com/crazycs520)| +|[ddl](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-ddl)|[djshow832](https://github.com/djshow832)| +|[ddl](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-ddl)|[lonng](https://github.com/lonng)| +|[ddl](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-ddl)|[winkyao](https://github.com/winkyao)| +|[ddl](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-ddl)|[wjhuang2016](https://github.com/wjhuang2016)| +|[planner](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-planner)|[eurekaka](https://github.com/eurekaka)| +|[planner](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-planner)|[francis0407](https://github.com/francis0407)| +|[planner](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-planner)|[lzmhhh123](https://github.com/lzmhhh123)| +|[tools](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tools)|[csuzhangxc](https://github.com/csuzhangxc)| + +## Reviewers + +| SIG name | GitHub ID | +|:--|:--| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[anotherrachel](https://github.com/anotherrachel)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[aylei](https://github.com/aylei)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[crazycs520](https://github.com/crazycs520)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[ericsyh](https://github.com/ericsyh)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[juliezhang1112](https://github.com/juliezhang1112)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[morgo](https://github.com/morgo)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[weekface](https://github.com/weekface)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[YiniXu9506](https://github.com/YiniXu9506)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[b41sh](https://github.com/b41sh)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[js00070](https://github.com/js00070)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[mmyj](https://github.com/mmyj)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[shihongzhi](https://github.com/shihongzhi)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[tangwz](https://github.com/tangwz)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[tsthght](https://github.com/tsthght)| +|[ddl](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-ddl)|[Deardrops](https://github.com/Deardrops)| +|[ddl](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-ddl)|[lysu](https://github.com/lysu)| +|[planner](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-planner)|[imtbkcat](https://github.com/imtbkcat)| +|[planner](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-planner)|[lamxTyler](https://github.com/lamxTyler)| +|[planner](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-planner)|[SunRunAway](https://github.com/SunRunAway)| +|[planner](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-planner)|[wjhuang2016](https://github.com/wjhuang2016)| +|[planner](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-planner)|[XuHuaiyu](https://github.com/XuHuaiyu)| +|[planner](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-planner)|[zz-jason](https://github.com/zz-jason)| + +## Active Contributors + +| SIG name | GitHub ID | +|:--|:--| +|[k8s](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-k8s)|[cwen0](https://github.com/cwen0)| +|[k8s](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-k8s)|[mikechengwei](https://github.com/mikechengwei)| +|[k8s](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-k8s)|[shonge](https://github.com/shonge)| +|[k8s](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-k8s)|[xiaojingchen](https://github.com/xiaojingchen)| +|[k8s](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-k8s)|[shinnosuke-okada](https://github.com/shinnosuke-okada)| +|[scheduling](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-scheduling)|[mantuliu](https://github.com/mantuliu)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[3pointer](https://github.com/3pointer)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[amyangfei](https://github.com/amyangfei)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[csuzhangxc](https://github.com/csuzhangxc)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[Deardrops](https://github.com/Deardrops)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[gmhdbjd](https://github.com/gmhdbjd)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[huangxiuyan](https://github.com/huangxiuyan)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[IzabelWang](https://github.com/IzabelWang)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[july2993](https://github.com/july2993)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[kissmydb](https://github.com/kissmydb)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[kolbe](https://github.com/kolbe)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[lamxTyler](https://github.com/lamxTyler)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[lance6716](https://github.com/lance6716)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[lichunzhu](https://github.com/lichunzhu)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[liubo0127](https://github.com/liubo0127)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[lysu](https://github.com/lysu)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[superlzs0476](https://github.com/superlzs0476)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[tangenta](https://github.com/tangenta)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[tennix](https://github.com/tennix)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[tiancaiamao](https://github.com/tiancaiamao)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[xiaojingchen](https://github.com/xiaojingchen)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[Yisaer](https://github.com/Yisaer)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[zhouqiang-cl](https://github.com/zhouqiang-cl)| +|[docs](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-docs)|[zimulala](https://github.com/zimulala)| +|[tiup](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tiup)|[c4pt0r](https://github.com/c4pt0r)| +|[tiup](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tiup)|[YangKeao](https://github.com/YangKeao)| +|[tiup](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-tiup)|[qinzuoyan](https://github.com/qinzuoyan)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[AerysNan](https://github.com/AerysNan)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[AndrewDi](https://github.com/AndrewDi)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[ekalinin](https://github.com/ekalinin)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[erjiaqing](https://github.com/erjiaqing)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[hey-kong](https://github.com/hey-kong)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[jacklightChen](https://github.com/jacklightChen)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[k-ye](https://github.com/k-ye)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[pingyu](https://github.com/pingyu)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[Rustin-Liu](https://github.com/Rustin-Liu)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[spongedu](https://github.com/spongedu)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[TennyZhuang](https://github.com/TennyZhuang)| +|[execution](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-exec)|[xiekeyi98](https://github.com/xiekeyi98)| +|[ddl](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-ddl)|[reafans](https://github.com/reafans)| +|[ddl](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-ddl)|[Rustin-Liu](https://github.com/Rustin-Liu)| +|[ddl](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-ddl)|[spongedu](https://github.com/spongedu)| +|[planner](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-planner)|[Deardrops](https://github.com/Deardrops)| +|[planner](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-planner)|[foreyes](https://github.com/foreyes)| +|[planner](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-planner)|[lonng](https://github.com/lonng)| +|[planner](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-planner)|[SeaRise](https://github.com/SeaRise)| +|[planner](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-planner)|[tiancaiamao](https://github.com/tiancaiamao)| +|[planner](https://github.com/pingcap/community/tree/master/special-interest-groups/sig-planner)|[wshwsh12](https://github.com/wshwsh12)| diff --git a/media/sql-optimization.png b/media/sql-optimization.png new file mode 100644 index 0000000000000000000000000000000000000000..bfbb528a35c99879b1e7ee781dd9c3ecd19d61ae GIT binary patch literal 70391 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 YVe^{9h-MyC%dM!jY>RwznE&4d0Pwz>`2YX_ literal 0 HcmV?d00001 diff --git a/predicates-push-down.md b/predicate-push-down.md similarity index 99% rename from predicates-push-down.md rename to predicate-push-down.md index 4aac41488e49b..c2be2f77c6302 100644 --- a/predicates-push-down.md +++ b/predicate-push-down.md @@ -1,6 +1,7 @@ --- title: Predicates Push Down summary: Introduce one of the TiDB's logic optimization rules—Predicate Push Down (PPD). +aliases: ['/tidb/dev/predicates-push-down'] --- # Predicates Push Down (PPD) diff --git a/sql-logical-optimization.md b/sql-logical-optimization.md new file mode 100644 index 0000000000000..66b0d6a8e8613 --- /dev/null +++ b/sql-logical-optimization.md @@ -0,0 +1,18 @@ +--- +title: SQL Logical Optimization +--- + +# SQL Logical Optimization + +This chapter explains some key logic rewrites to help you understand how TiDB generates the final query plan. For example, when you execute the `select * from t where t.a in (select * from t1 where t1.b=t.b)` query in TiDB, you will find that the `IN` sub-query `t.a in (select t1.a from t1 where t1.b=t.b` does not exist because TiDB has made some rewrites here. + +This chapter introduces the following key rewrites: + +- [Subquery Related Optimizations](/subquery-optimization.md) +- [Column Pruning](/column-pruning.md) +- [Decorrelation of Correlated Subquery](/correlated-subquery-optimization.md) +- [Eliminate Max/Min](/max-min-eliminate.md) +- [Predicates Push Down](/predicate-push-down.md) +- [Partition Pruning](/partition-pruning.md) +- [TopN and Limit Operator Push Down](/topn-limit-push-down.md) +- [Join Reorder](/join-reorder.md) \ No newline at end of file diff --git a/sql-optimization-concepts.md b/sql-optimization-concepts.md index 2523885978ba9..6830f6d506139 100644 --- a/sql-optimization-concepts.md +++ b/sql-optimization-concepts.md @@ -6,29 +6,12 @@ aliases: ['/docs/stable/sql-optimization-concepts/','/docs/v4.0/sql-optimization # SQL Optimization Process -In TiDB, the process of SQL optimization consists of two phases: logical optimization and physical optimization. This document describes the logical and physical optimization to help you understand the whole process. +In TiDB, the process from inputting a query to getting the execution result according to the final execution plan is illustrated as follows: -## Logical optimization +![SQL Optimization Process](/media/sql-optimization.png) -Based on rules, logical optimization applies some optimization rules to the input logical execution plan in order, to make the whole logical execution plan better. The optimization rules include: +After parsing the original query text by `parser` and some simple validity checks, TiDB first makes some logically equivalent changes to the query. For detailed changes, see [SQL Logical Optimization](/sql-logical-optimization.md). -- Column pruning -- Eliminate projection -- Decorrelate correlated subqueries -- [Eliminate Max/Min](/max-min-eliminate.md) -- Push down predicates -- Partition pruning -- Push down TopN and Limit -- [Join Reorder](/join-reorder.md) +Through these equivalent changes, this query becomes easier to handle in the logical execution plan. After the equivalent change is done, TiDB obtains a query plan structure equivalent to the original query, and then obtains a final execution plan based on the data distribution and the specific execution cost of an operator. For details, see [SQL Physical Optimization](/sql-physical-optimization.md). -## Physical optimization - -Based on cost, physical optimization makes the physical execution plan for the logical execution plan generated in the previous phase. - -In this phase, the optimizer selects the specific physical implementation for each operator in the logical execution plan. Different physical implementations of logical operators differ in time complexity, resource consumption, physical properties, and so on. During this process, the optimizer determines the cost of different physical implementations according to data statistics, and selects the physical execution plan with the minimum whole cost. - -The logical execution plan is a tree structure and each node corresponds to a logical operator in SQL. Similarly, the physical execution plan is also a tree structure, and each node corresponds to a physical operator in SQL. - -The logical operator only describes the function of an operator, while the physical operator describes the concrete algorithm that implements this function. A single logical operator might have multiple physical operator implementations. For example, to implement `LogicalAggregate`, you can use either `HashAggregate` the of the hash algorithm, or `StreamAggregate` of the stream type. - -Different physical operators have different physical properties, and have different requirements on the physical properties of their subnodes. The physical properties include the data's order, distribution, and so on. Currently, only the data order is considered in TiDB. +At the same time, when TiDB executes the [`PREPARE`](/sql-statements/sql-statement-prepare.md) statement, you can choose to enable caching to reduce the cost of generating the execution plan in TiDB. For details, see [Execution Plan Cache](/sql-prepare-plan-cache.md). diff --git a/sql-physical-optimization.md b/sql-physical-optimization.md new file mode 100644 index 0000000000000..96552f32efbce --- /dev/null +++ b/sql-physical-optimization.md @@ -0,0 +1,14 @@ +--- +title: SQL Physical Optimization +--- + +# SQL Physical Optimization + +Physical optimization is cost-based optimization, which makes a physical execution plan for the logical execution plan generated in the previous stage. In this stage, the optimizer selects a specific physical implementation for each operator in the logical execution plan. Different physical implementations of logical operators have different time complexity, resource consumption and physical properties. In this process, the optimizer determines the cost of different physical implementations based on the statistics of the data, and selects the physical execution plan with the smallest overall cost. + +[Understand the Query Execution Plan](/query-execution-plan.md) has introduced some physical operators. This chapter focuses on the following aspects: + +- In [Index Selection](/choose-index.md), you will learn how to select the optimal index to access tables when TiDB has multiple indexes on a table. +- In [Introduction to Statistics](/statistics.md), you will learn what statistics TiDB collects to obtain the data distribution of a table. +- [Wrong Index Solution](/wrong-index-solution.md) introduces how to use the right index when you find the index is selected wrongly. +- [Distinct Optimization](/agg-distinct-optimization.md) introduces an optimization related to the `DISTINCT` keyword during physical optimization. In this section, you will learn its advantages and disadvantages and how to use it. diff --git a/sql-statements/sql-statement-add-index.md b/sql-statements/sql-statement-add-index.md index ddf180d1e7c8f..80134b517571b 100644 --- a/sql-statements/sql-statement-add-index.md +++ b/sql-statements/sql-statement-add-index.md @@ -109,6 +109,8 @@ mysql> EXPLAIN SELECT * FROM t1 WHERE c1 = 3; ## See also +* [Index Selection](/choose-index.md) +* [Wrong Index Solution](/wrong-index-solution.md) * [CREATE INDEX](/sql-statements/sql-statement-create-index.md) * [DROP INDEX](/sql-statements/sql-statement-drop-index.md) * [RENAME INDEX](/sql-statements/sql-statement-rename-index.md) diff --git a/sql-statements/sql-statement-create-index.md b/sql-statements/sql-statement-create-index.md index ec9909e504ebc..af342f221bce4 100644 --- a/sql-statements/sql-statement-create-index.md +++ b/sql-statements/sql-statement-create-index.md @@ -161,6 +161,8 @@ The global variables associated with the `CREATE INDEX` statement are `tidb_ddl_ ## See also +* [Index Selection](/choose-index.md) +* [Wrong Index Solution](/wrong-index-solution.md) * [ADD INDEX](/sql-statements/sql-statement-add-index.md) * [DROP INDEX](/sql-statements/sql-statement-drop-index.md) * [RENAME INDEX](/sql-statements/sql-statement-rename-index.md) diff --git a/sql-tuning-overview.md b/sql-tuning-overview.md new file mode 100644 index 0000000000000..567e948ba5d1f --- /dev/null +++ b/sql-tuning-overview.md @@ -0,0 +1,11 @@ +--- +title: SQL Tuning Overview +--- + +# SQL Tuning Overview + +The previous "Troubleshoot" chapter describes some ways to locate some queries that affect the cluster, and that if some queries' execution time does not meet expectations, you need to analyze the execution result to find the cause. In this chapter, the following sections introduce how to tune a specific query: + +- In the first section, [Understand the Query Execution Plan](/query-execution-plan.md) introduces how to use the `EXPLAIN` and `EXPLAIN ANALYZE` statements to understand how TiDB executes a query. +- In the second section, [SQL Optimization Process](/sql-optimization-concepts.md) introduces the optimizations used internally by TiDB, which involves some equivalent SQL conversions and the selection of physical plans. This section helps you understand how TiDB generates the final execution plan. +- In the third section, [Control Execution Plan](/control-execution-plan.md) introduces the ways to control the generation of the execution plan, which improves the execution speed of the query and reduces its impact on the overall performance of the cluster or online business. diff --git a/ticdc/troubleshoot-ticdc.md b/ticdc/troubleshoot-ticdc.md index ec91cb98f9de5..97e063d1fbbd4 100644 --- a/ticdc/troubleshoot-ticdc.md +++ b/ticdc/troubleshoot-ticdc.md @@ -35,7 +35,7 @@ A replication task might be interrupted in the following known scenarios: - In this scenario, TiCDC saves the task information. Because TiCDC has set the service GC safepoint in PD, the data after the task checkpoint is not cleaned by TiKV GC within the valid period of `gc-ttl`. - Handling procedures: 1. Query the status information of the replication task using the `cdc cli changefeed query` command and record the value of `checkpoint-ts`. - 2. Use the new task configuration file and add the `ignore-txn-commit-ts` parameter to skip the transaction corresponding to the specified `commit-ts`. + 2. Use the new task configuration file and add the `ignore-txn-start-ts` parameter to skip the transaction corresponding to the specified `start-ts`. 3. Stop the old replication task via HTTP API. Execute `cdc cli changefeed create` to create a new task and specify the new task configuration file. Specify `checkpoint-ts` recorded in step 1 as the `start-ts` and start a new task to resume the replication. ## `gc-ttl` and file sorting From d1cdfdf94deba20941551b3133e56101afec9848 Mon Sep 17 00:00:00 2001 From: Keke Yi <40977455+yikeke@users.noreply.github.com> Date: Mon, 3 Aug 2020 14:42:31 +0800 Subject: [PATCH 2/2] Update predicate-push-down.md --- predicate-push-down.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/predicate-push-down.md b/predicate-push-down.md index c2be2f77c6302..f4cb47bf3101d 100644 --- a/predicate-push-down.md +++ b/predicate-push-down.md @@ -1,7 +1,7 @@ --- title: Predicates Push Down summary: Introduce one of the TiDB's logic optimization rules—Predicate Push Down (PPD). -aliases: ['/tidb/dev/predicates-push-down'] +aliases: ['/tidb/stable/predicates-push-down'] --- # Predicates Push Down (PPD)