From fb876130aa6be57ae7431ade5ce45a4729d15235 Mon Sep 17 00:00:00 2001 From: Ran Date: Wed, 25 Mar 2020 16:54:40 +0800 Subject: [PATCH] reference/performance: add doc for join reorder (#2020) --- TOC.md | 1 + media/join-reorder-1.png | Bin 0 -> 10561 bytes media/join-reorder-2.png | Bin 0 -> 21764 bytes media/join-reorder-3.png | Bin 0 -> 16684 bytes reference/performance/join-reorder.md | 55 ++++++++++++++++++ .../performance/sql-optimizer-overview.md | 1 + 6 files changed, 57 insertions(+) create mode 100644 media/join-reorder-1.png create mode 100644 media/join-reorder-2.png create mode 100644 media/join-reorder-3.png create mode 100644 reference/performance/join-reorder.md diff --git a/TOC.md b/TOC.md index 7067945ee40b..fc25af28acc9 100644 --- a/TOC.md +++ b/TOC.md @@ -277,6 +277,7 @@ + Performance - [Overview](/reference/performance/sql-optimizer-overview.md) - [Understanding the Query Execution Plan](/reference/performance/understanding-the-query-execution-plan.md) + - [Introduction to Join Reorder](/reference/performance/join-reorder.md) - [Introduction to Statistics](/reference/performance/statistics.md) - [Optimizer Hints](/reference/performance/optimizer-hints.md) - [Follower Read](/reference/performance/follower-read.md) diff --git a/media/join-reorder-1.png b/media/join-reorder-1.png new file mode 100644 index 0000000000000000000000000000000000000000..c4b049bd143b1942b066adb2c68122e94b8b7bbe GIT binary patch literal 10561 zcmd6N2{@Hq_xC=d*)eCzQN}W6o{yQ6M1)X0X2w5p+_5Q!>+wA-P-RoX^?X}ikd*5qs=&$ILfNQ5Y-WNu&@#qbBN-B*vVo;GAlJ*y zCx){?1#k}v1H)PUqbwaD4DrK7y&_B?UjhLLD|>sGT0vM8!sa1CyBXun zpnLif%<&M0A_N{wh{W%OFr)2pp9nL12t)GW7m1;EKl_4T^d*`Y{cKz2L4?o`{?@2K z2L_!X|CPTF{+Il(@&0?AAUdQof;F1p$e0nF5Eh6Cv}fo8>41=o_cvkCH+YCqb`1R` zA-axFh=nnPA$<^TzC?3|?F@cma0G-lbVD5XC*T=vAw3cKk^XxbW6Y3K>gBPazaWHb zeL{?W`UK(T6S0q>+lF1wMnv2HY>PCAB<^LA_)0w%x|h=VAodV)|8 z00`X+H4D(wk2mJP0}z29@Bs=xDZg4cZM+GAuJ#}vEP@b-C*pTIOY9Y0MY5O-n>Mg1lHH{iTO`?X~ z3CYA?9KYlNYcL7*^TSs@kRSiWW~4MERUK)J)Q99lvXKHvVW5CigL*PT;-J3OA*#tw zYZ%u5^8CMA_1gyUx7UC2u_&{^SvIj4vdI3~l5;z!`fm*xKKTMjS*a-&USiru~o-=@T0X#Vs%i4T~cZ{QM)uji8m^M;ssGr6@11 zqO76}0OLEt-~r%^z{d9hCh+WUTKHoCw9}!riLr!>Gq?cokO1JpTL5^M{-#NMhNj0U z03P*tMG>Qa@F5vD6kr7yXhsPEF(3hCA$wGS2G9kDzzpmJHefGs25wN)`9twc1Ti21 z90sW%1NzdQ1^J)=6oVV!4yXV%pdK`VC!iDbfC2Ctik>&%10aJXunL30m|z?*UYHOJ z3zLG$!Bk*cFawwwY!}Q9<_!A_<_8ObMZpqaDXL*a{p0XNU8_H^ZgjN^mW>5!?#C7k&Wl2M>qG!;ipE!q35r;HB{U@FsXCd;mTP z{{a7n00=gO0AdS50ilI3LD(Q%5WWZ^A_$VC(($`EzXIQJta5eta#NHmfcDUMWt zBG?k?fb>F!Ba@IPkom|P$ot4vWIu8WNk*=tI8dS}Ig}0xkJ^XwL&cy{QMst=sA^Oj zG@IU_me6Rl09ppE3C%`lbO8Dw`ULtCx*Yu&-HV<U z=LOFDoPC@hF)SD^r0{m(J;E`QdHaNSCwDy;MuWrNAixk9iLUUt9YqgP~CJ}q0V6IxHTQQF4ZB<*_b?>ZVf zkvbJRpL7*;19fld&gseM`RHBMo6+B@@1cK1f6_qQ;4gzhgGt;LoCmH5H*F|k=xuo2 z@SV{%qX45)qmRbQ#zf<4<7E>alSGrprU+9D({$5rGafSsvwX90^R4E7=C{qs7U~uU zEgoB%!#X=yKiVo2!}YS=TrF)%U0FA3Pv)Aof6q zo3LAu+aq_3yN7$_U#P#F{<`%S&BMl{$m5$Q-t(d-*~`Q$&+CJ?q4yc@c^`eB9G`c- z`o1~7bAI}Mr~T&rasIjf3j`BFK7kTo8Bh?g9B30*5=akn3Mvm~4*o0nK?qMsU`T7I zSZHi$Z-*m`XHCypjY<@=R(bNsx|^-W;+xbmK7V;lRUP z$;!z&$zM~PQtFOuK62>D%u$P@w^KP&iK#=!bdMDrM;<2}?@m)qJD;|m?w$TDLpdWi zgLcB}#IwvDnddU;Cw)(LXK7?zK7~FNa%wOemwh9LJ10J8=Ct+c`)9<@q@VeE*8OZp zu3BzE9&27y-sHJm=W5SOoU~@r6!Ac>a z@YNNIEBA|}i*k$6#nHuYuR30BzovEV=5^ug8Q0fJLP{oY*xhKosd@9}Ezw(9x8b*= zZqJwQFYUQwdZ)Hbq3lYzKzYVpa5w7i`+I-g8?3OZXs*<%EUS{Lx>(Iyoqiv7Kkh!c z#=mB=*15L#!OjQGb-H!c4;3Gl)NiT3@QD9WRs(Cpkp_BWeB-yrVUHJ@{F-K(-J4&x z>}z@1x~H|f&8qF`6Z0o6?MCg5PxYVHcj$CHc&7ENrchAAV_Bdf0ujiN@= z$GFCF$3@4BCbmtKPijm)nlhbwK5ak!dd6$!!)(MX?ah(59B*^qVc*@HQ<Sd z09Mx@`@9Vf*pIy_gke7`gZu~nu@_{#fN}^>VhDi4Apmwg2H-MOr69}>-5II+UPAy^ zRsCHd3Zq2$s;X=N7&{S4O{jGGm(2h$)d8?Zq|;X~(dlbfp}oQ|0FT3e>@OMIXf6N> z6&a}K%}2)Ve=GFIfSVck!-xpjRsiRQA-G}mR)B?cM?r}RRDN;8;0PoN&BV;Y$_6o1 za{)LEfq)|sC=}yR0G0^72S{!d&z2oVXx=>@Ok2bGR1RlfVU{qy*TiqvOO{miBqp=4 z3TzS-5|)ydk=?dkO}r&07_fRn_-vY9G`!x3soBX@A=Btgrv&z~IoU z;gPB7nb|jQ-_6axr+ohM_1n@i_4^9LE*L=kFzdHvf7rzh*#$=;5lAM6T`+hIR1w@r z)RrA+9-}=>9^t%ORSq-r8E0R)*Tf>BYDebxB=)ijNUBXqQ5dFeSoZH3mi&KZ*>A)C zw(B*NKEpQ(0uD!@5C{Ycje-iA8OpZMXl7RCjl%k~ux}JjM#20pbVvvcl7U1bnV?@T zHWoIn|8}8|L5E0!^bx?0fDU%J5!?U=)@ViPvfzKPBIrH8`uH9=ef>^Z?CSJ^#wLBm zl|%`Xs{Wz9LuCryJNA#Zsn**%n~5Wzls$9tWcIZ=>r5oVKGq#;#Q}n*g5NFbgB)btb6TB#hORDr3MQ6lG@%l zdQtNq&;hI0n(UaqM#2|aau1OR)|e<;EbYq7_S4=}2uK;?86J2l*)-sJZ1e83pT zKx-J{>v(hh!31_d3rqK3qt{IC?4jh&?L=I<`!;{~>q1$C9fXHj#R! zib<2r6LgSKye?4F{Aop0EtDqcN(YpvH+1mlX!ZU%p8u2aROv^NnHszjc0X5aTVI(U z>7l4ok8VNH?VP}l#;IKiVo<1UGJ-``tB}jc8M3 z68ezA8Kg3MiTGEw>d#C^rfaDp6gd-e$fdaOh{;f4wZZ$jF+AtZPv2<0qjKk=rd+U^ zM_y;g$Rt;oWqJAB&jsRLg8Q_q5}Io7ObIDsbD6szF>YBnSTUlos|1l-pm1D6}`82!!;3S!Zh?)Z==fS*1jk?747hcy! zcEz+Hl@ps^Yve_vIwo_B6z2aq1pm1S^Z#1}6d7!%DS7fIcogTvf`E;sE&6^h#jYd0RpEiv`tmL4T~xyukppCd?Iqyyxl|ys&N@QnN#s#b`Q&z1p69bwYh0*6^VC(>fn#s{;mP*Cu1TtGNynYK+^a&H z8^vN**SSJB(UfZY``d7sZ>4N)H>W0esQ3Gu45VtI<=v{0{9Hk6mD6&EYc*L~=#u5y$3a>1y?)s6yoTHo=FiSA|RlPdW4apgg&%S-8}r|R>F^J1Ga+V9{#E^@5R z_vOA0TV38d)UAT*`0nxgBKu7K=f+`~sblT#DGh>kWSKT*nx^!r8l9tS)lahG;=+kT z!bfMubS(1(?uut3kDwhTC%vNzG39eb=|JvDf-W7%_$1PSrzv)YnENQd-mj(cbF|aM zk|Z>NOSbtV-rr(45~>F7)X#Wo7C8|!rqeaw9+V-ZOk(}^>@zM4``IoDLwe=8N(YwS z<@*ca>9U2GbELrXOfhk)5ZR_xYzO)J*~G+Bi$L74qC)BVP_WN-#W(q1c%Z*j@AFS?) zRdu5tTh&c4B|9Bm>>4k>?O$_h#E=Kho7l{+ zg&XeHTJ}Ld`dE)yx=IJ96DTj%QVO7qzy-{!8E!JW>mUdp7YB3@=6KC_uJJR|Jvu1k zCe6XCZh%q@--njwb+JYYOMkg~=v`BvRp|oEh~nFJa*KfZl76aLXs;m_z1~Txj!9dW zCvQH69Qy=@RZ}HCLgX}FQ<5H%?)NFHRd9dPxnv3?+*b`Xh(r;PE zFAGu!L|vM@kolP8Ykgmrtf*-S03WsKOY=a{*b{9M}l{##3%Y%&{t6Hb-Ipi{UN&V>50=LS<#jJ~>-NQ-TlypKNDq07%NTm&no1_DM@A zW>2+0WpR(6;=Y&}A^j+VTsgTmTEjhOphpqPa5*_}$>(8zSy!n8LExEjf4#cS2u>wYg?|0}woF6$_c6BAFO<{P{SdrK3 zuKlqQ!Eng$a*T|=T!{RMcIoW$S{fH={+Y{C0HuJF4myV2Nw2b*)-PTw#N4_8txK{{ z{Z5)`r=2NCnOG8RfV?RrHzfCTU60g(XQaCx8K2g+F3a&-y$+w zInf9G1`kOVHHcCzDDF$iLyZ9k{H8v&b+TbN=6PZbIO1DOD$go;SE&SG{5b|D&A!NN z)s(-7mEC5m^7!6cnkxk{{izL`A*M%uamYY=n5NRN#~l+`I7jIU^a)#8KJHhw>Ycqa z6rq`$-YJ;QuAA_p;0!BRV=8LYR%{Hwh|+AS?quVMCY{Wh!!!#@kbCFN_kAX!NteyJBXW0TULPB9hJ6-JfimCjw>nk>6T zCpY`H#2FQ~{f1q9*%fIL!19`_P!~u%YQ|^FbR;2!4o=lHm#=RA+PKCW;eKG~X@N-N ztOEJ=dV8W09hi;|4MlEb!A^(QUlx20y{t_KccD-7oR!;mH>OoPQb$AVyY;3QP`;)B zB1e>HhZjg6j<~OYJKMW@NwXL)I@rIJ4th`oTbLO?xxJl~fveI?SyxKX?yE}FXla?i ze9ID?k4G+Nsm0{2)QvaEe|ppGB^L;f+kL{h{%r!^$a#6#vOYiM-J%dh^@)Hxm!1eY zw8?E-%HxbX!|&tAA53p6syQ=XXMW~}NarT!!!FK}tlp=%g_B=(#i`dUn#?q&;#eCr zjb`+XUq4xwq3&A34(FHJwj*^O)g0fN`8Cb=nx?jEuej8=nXn8oQPbuACR$}poA zOn2%!0C~FuEfF=M9&Y=bDJNSC?#R$o8`E%erPSi})hcMW$OrqN{&~~lVRFk%-jf%p zD<#dORBkG9GqzQuxBXyDshgWo1pB@HlAW{dp@BLorw;KvFS&enp@7`IE=dPP&`xUg zV?Q07fVR5qpQdeABpd(=ci{;1cpi~QZ%eN=sN<#a%TJw>KHE3;xgJobWPe{iHeZg=n1 z{DaoGUH7v;Zgz?5lg@Q6Aug`o<&y;$Df9o1I`LinvlIV@+VNenL(Qi#nFd<152wv@ zrf1ChzIM8Ez8)>vVG}Oew}13|FwI!n$FAkXEIi!FVxccT9Z#5k0VM{53sQC!F4eQq zy*o=j$)_@B4_nTN9E)FJYiSVesh22niH&H{*g>fCNe)ULN3jUA=Y%m4@$xqEc*z`m zA;<5m%8R!cXN1j_0aV>0Xk6fe4|IpT>J|N@Vrey?o=- z!{g?vQrBi>B2^2Y%@#+A`{{BkajX^HL=q){>tTv*VN02_*`0YDRXblV)DqbPYT7Si30(mzbK| zPfT!qQxZy07@(1S$^!*1E0d!J&tB`iDep4ke5bT$XRqHvUz!AamNefLg^PC*4?`yv zf$i>J@p?9Nkl+GsZC7xAC})V}#2ji+rfQRmml7zLsq#_!xY{|IrHeZ4TU2@ESKnDIJD{0K??2(bljm<&T@b%)08uxk4vrJQ8F>2 zp4q>T5GdEF>xxg?n)xP=I}~=_DO_}@j?_Ft8Cv79;iZEKfks+V7S+{F2a0|CG--7j zIu^<5VXEtOMdM2uq z+R#0#w5C#BQyXVPLkh3FZ-}JEkUu=hFF4WO=AHo`nb=dAY88yNtoBlK39`qIcS?>) zJvbY7q>%L%v(VV*wM{=$z?ek^uZSDaw|}gSg(|^mXE+u}k&6HMj7>6$P!rsD z%9#>esQjW0!sJ{iK3F~_7ZW7=`{d3oR_kkT?iBIky=!%R2=~zEuQemV5j1pU^+)K8 z1%ByYdQ2HxYd^6rNIhsu*376LB;zuxGD)^|{d%~>gT6r?RS$RsL$+iVpMBYVsOVzK zsW@~)E_B#cJyX6Sc^O(z8=wQRH7xmlJ#^w@db*VkmfN6{1Z*MZVgrtVzeydMnrI(0 zX%a3^qhW6P>l7TLSzT4UpjLP3QEJ&e8)VKrmA61~-?Q$+F;6(dv)y(l!Ks~4=Gu%K zVQNhhCAUJGJM1M+49nce5v*ses}i%>rdJ71_osv?N@XTXUf8L~(tIlLqx+vj51q06 z8Lr?vQ}al0&6BLmMoe`Uil#U~gOyN84v#1?86Ts96|L2*?{s+wdn9X|Q5x|XU-+yS zXIQ8~{I=rvU&YWrf?w=|TNLG>ZFS!|e{Ay#WywtJ^uf~~dn#^-&7NX<6h1Tk;$%lN zO_HKvv+LRoY}yy<)x5_Ayh&;k!_Eojy))!vhZm*N-@e-wH}kMzz)gDe)bpNu>2irp z&O`Exne~3#VISSmrDbXpN5s(mWkcRebpq%4GUnz3h40ds%Pp^4h=!ZrGrhtM92^80 d|NRsRFZh|OzWjB9`agD3i=YquKj>rle*p(q-0}bb literal 0 HcmV?d00001 diff --git a/media/join-reorder-2.png b/media/join-reorder-2.png new file mode 100644 index 0000000000000000000000000000000000000000..a857c0ad7b709937f5b85a7bb7e1c0ed95d7c215 GIT binary patch literal 21764 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 ZJuq_2He#74MGF~M-u2%vk3-4h{|}`3BG~`{ literal 0 HcmV?d00001 diff --git a/reference/performance/join-reorder.md b/reference/performance/join-reorder.md new file mode 100644 index 000000000000..e0e97effb991 --- /dev/null +++ b/reference/performance/join-reorder.md @@ -0,0 +1,55 @@ +--- +title: Introduction to Join Reorder +summary: Use the Join Reorder algorithm to join multiple tables in TiDB. +category: reference +--- + +# Introduction to Join Reorder + +In real application scenarios, it is common to join multiple tables. The execution efficiency of join is associated with the order in which each table joins. + +For example: + +{{< copyable "sql" >}} + +```sql +SELECT * FROM t1, t2, t3 WHERE t1.a=t2.a AND t3.a=t2.a; +``` + +In this query, tables can be joined in the following two orders: + +- t1 joins t2, and then joins t3 +- t2 joins t3, and then joins t1 + +As t1 and t3 have different data volumes and distribution, these two execution orders might show different performances. + +Therefore, the optimizer needs an algorithm to determine the join order. Currently, TiDB uses the Join Reorder algorithm, also known as the greedy algorithm. + +## Instance of Join Reorder algorithm + +Take the three tables above (t1, t2, and t3) as an example. + +First, TiDB obtains all the nodes that participates in the join operation, and sorts the nodes in the ascending order of row numbers. + +![join-reorder-1](/media/join-reorder-1.png) + +After that, the table with the least rows is selected and joined with other two tables respectively. By comparing the sizes of the output result sets, TiDB selects the pair with a smaller result set. + +![join-reorder-2](/media/join-reorder-2.png) + +Then TiDB enters the next round of selection. If you try to join four tables, TiDB continues to compare the sizes of the output result sets and selects the pair with a smaller result set. + +In this case only three tables are joined, so TiDB gets the final join result. + +![join-reorder-3](/media/join-reorder-3.png) + +The above process is the Join Reorder algorithm currently used in TiDB. + +## Limitations of Join Reorder algorithm + +The current Join Reorder algorithm has the following limitations: + +- The Join Reorder for Outer Join is not supported +- Limited by the calculation methods of the result sets, the algorithm cannot ensure it selects the optimum join order. + +Currently, the `STRAIGHT_JOIN` syntax is supported in TiDB to force a join order. For more information, refer to [Description of the syntax elements](/reference/sql/statements/select.md#description-of-the-syntax-elements). diff --git a/reference/performance/sql-optimizer-overview.md b/reference/performance/sql-optimizer-overview.md index 8bf67aeb396e..5a660fa722fe 100644 --- a/reference/performance/sql-optimizer-overview.md +++ b/reference/performance/sql-optimizer-overview.md @@ -19,6 +19,7 @@ Based on rules, logical optimization applies some optimization rules to the inpu - Push down predicates - Partition pruning - Push down TopN and Limit +- [Join Reorder](/reference/performance/join-reorder.md) ## Physical optimization