diff --git a/docs/query-acceleration/hints/distribute-hint.md b/docs/query-acceleration/hints/distribute-hint.md index c5bec263c42e4..3e13e5a925a68 100644 --- a/docs/query-acceleration/hints/distribute-hint.md +++ b/docs/query-acceleration/hints/distribute-hint.md @@ -105,7 +105,7 @@ explain shape plan from ( select - /*+ leading(orders shuffle {lineitem shuffle part} shuffle {supplier broadcast nation} shuffle partsupp) */ + /*+ leading(orders [shuffle] (lineitem [shuffle] part) [shuffle] (supplier [broadcast] nation) [shuffle] partsupp) */ n_name as nation, extract(year from o_orderdate) as o_year, l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount diff --git a/docs/query-acceleration/hints/leading-hint.md b/docs/query-acceleration/hints/leading-hint.md index 9842250dff7ea..73b88ce0caf00 100644 --- a/docs/query-acceleration/hints/leading-hint.md +++ b/docs/query-acceleration/hints/leading-hint.md @@ -99,7 +99,7 @@ When Leading Hint is not effective, the normal process will be used to generate 2. At the same time, curly braces can be used to specify the shape of the Join tree: ```sql - mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; + mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; +----------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +----------------------------------------------------------------------------------+ @@ -115,7 +115,7 @@ When Leading Hint is not effective, the normal process will be used to generate | --------------PhysicalOlapScan[t3] | | | | Hint log: | - | Used: leading(t1 { t2 t3 }) | + | Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +----------------------------------------------------------------------------------+ @@ -262,7 +262,7 @@ When Leading Hint is not effective, the normal process will be used to generate When you need to make the shape of the plan a right-deep tree, Bushy tree, or zig-zag tree, you only need to add curly braces to limit the shape of the plan, without the need to use swap like Oracle to adjust step by step from the left-deep tree. ```sql - mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; + mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; +-----------------------------------------------+ | Explain String | +-----------------------------------------------+ @@ -277,7 +277,7 @@ When Leading Hint is not effective, the normal process will be used to generate | ------------PhysicalDistribute | | --------------PhysicalOlapScan[t3] | | | - | Used: leading(t1 { t2 t3 }) | + | Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +-----------------------------------------------+ @@ -286,7 +286,7 @@ When Leading Hint is not effective, the normal process will be used to generate 3. Bushy Tree ```sql - mysql> explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; + mysql> explain shape plan select /*+ leading((t1 t2) (t3 t4)) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +-----------------------------------------------+ | Explain String | +-----------------------------------------------+ @@ -313,7 +313,7 @@ When Leading Hint is not effective, the normal process will be used to generate 4. zig-zag tree ```sql - mysql> explain shape plan select /*+ leading(t1 {t2 t3} t4) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; + mysql> explain shape plan select /*+ leading(t1 (t2 t3) t4) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +--------------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +--------------------------------------------------------------------------------------+ @@ -347,7 +347,7 @@ When Leading Hint is not effective, the normal process will be used to generate ```sql -------- test outer join which can not swap -- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) - mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; + mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; +--------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +--------------------------------------------------------------------------------+ @@ -364,7 +364,7 @@ When Leading Hint is not effective, the normal process will be used to generate | | | Hint log: | | Used: | - | UnUsed: leading(t1 { t2 t3 }) | + | UnUsed: leading(t1 ( t2 t3 )) | | SyntaxError: | +--------------------------------------------------------------------------------+ ``` @@ -383,13 +383,13 @@ When Leading Hint is not effective, the normal process will be used to generate -- (t1 leftjoin t2 on (P12)) leftjoin t3 on (P23) = t1 leftjoin (t2 leftjoin t3 on (P23)) on (P12) select /*+ leading(t2 t3 t1) SWAP_INPUT(t1) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; - explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; - explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; + explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; + explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; -------- test outer join which can not swap -- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) -- eliminated to inner join - explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; + explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; explain graph select /*+ leading(t1 t2 t3) */ * from t1 left join (select * from t2 join t3 on c2 = c3) on c1 = c2; -- test semi join diff --git a/docs/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md b/docs/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md index dc743a8975f0d..03e996282235d 100644 --- a/docs/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md +++ b/docs/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md @@ -105,7 +105,7 @@ Similarly, the Hint log shows the successfully applied hint: `Used: leading(t1 t ## Case 3: Forcing the Generation of a Right-Deep Tree ```sql -mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3; +mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3; +----------------------------------------------------------------------------------+ | _Explain_ String(Nereids Planner) | +----------------------------------------------------------------------------------+ @@ -121,18 +121,18 @@ mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on | --------------PhysicalOlapScan[t3] | | | | Hint log: | -| Used: leading(t1 { t2 t3 }) | +| Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +----------------------------------------------------------------------------------+ ``` -Similarly, the Hint log shows the successfully applied hint: `Used: leading(t1 { t2 t3 })`. +Similarly, the Hint log shows the successfully applied hint: `Used: leading(t1 ( t2 t3 ))`. ## Case 4: Forcing the Generation of a Bushy Tree ```sql -mysql> explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3 join t4 on t3.c3 = t4.c4; +mysql> explain shape plan select /*+ leading((t1 t2) (t3 t4)) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3 join t4 on t3.c3 = t4.c4; +-----------------------------------------------+ | _Explain_ String | +-----------------------------------------------+ @@ -202,7 +202,7 @@ explain shape plan from ( select - /*+ leading(orders shuffle {lineitem shuffle part} shuffle {supplier broadcast nation} shuffle partsupp) */ + /*+ leading(orders [shuffle] (lineitem [shuffle] part) [shuffle] (supplier [broadcast] nation) [shuffle] partsupp) */ n_name as nation, extract(year from o_orderdate) as o_year, l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount @@ -230,7 +230,7 @@ explain shape plan o_year desc; ``` -The above hint specification `/*+ leading(orders shuffle {lineitem shuffle part} shuffle {supplier broadcast nation} shuffle partsupp) */` mixes the two formats of leading and distribute hint. Leading is used to control the relative join order among the overall tables, while shuffle and broadcast are used to specify the shuffle method for specific joins. By combining the two, the connection order and connection method can be flexibly controlled, making it convenient to manually control the expected plan behavior of the user. +The above hint specification `/*+ leading(orders [shuffle] (lineitem [shuffle] part) [shuffle] (supplier [broadcast] nation) [shuffle] partsupp) */` mixes the two formats of leading and distribute hint. Leading is used to control the relative join order among the overall tables, while shuffle and broadcast are used to specify the shuffle method for specific joins. By combining the two, the connection order and connection method can be flexibly controlled, making it convenient to manually control the expected plan behavior of the user. :::caution Usage Suggestions - It is recommended to use EXPLAIN to carefully analyze the execution plan to ensure that the Leading Hint can achieve the expected effect. diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/current/query-acceleration/hints/distribute-hint.md b/i18n/zh-CN/docusaurus-plugin-content-docs/current/query-acceleration/hints/distribute-hint.md index 4b8d5ae99f4fa..b07c812153e54 100644 --- a/i18n/zh-CN/docusaurus-plugin-content-docs/current/query-acceleration/hints/distribute-hint.md +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/current/query-acceleration/hints/distribute-hint.md @@ -106,7 +106,7 @@ explain shape plan from ( select - /*+ leading(orders shuffle {lineitem shuffle part} shuffle {supplier broadcast nation} shuffle partsupp) */ + /*+ leading(orders [shuffle] (lineitem [shuffle] part) [shuffle] (supplier [broadcast] nation) [shuffle] partsupp) */ n_name as nation, extract(year from o_orderdate) as o_year, l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/current/query-acceleration/hints/leading-hint.md b/i18n/zh-CN/docusaurus-plugin-content-docs/current/query-acceleration/hints/leading-hint.md index d3fc6c7057866..83f3b616dacbd 100644 --- a/i18n/zh-CN/docusaurus-plugin-content-docs/current/query-acceleration/hints/leading-hint.md +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/current/query-acceleration/hints/leading-hint.md @@ -100,7 +100,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = 2. 同时允许使用大括号指定 Join 树形状: ```sql - mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; + mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; +----------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +----------------------------------------------------------------------------------+ @@ -116,7 +116,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = | --------------PhysicalOlapScan[t3] | | | | Hint log: | - | Used: leading(t1 { t2 t3 }) | + | Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +----------------------------------------------------------------------------------+ @@ -262,7 +262,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = 当需要将计划的形状做成右深树、Bushy 树或者 zig-zag 树时,只需加上大括号来限制 plan 的形状即可,无需像 Oracle 使用 swap 从左深树一步步调整。 ```sql - mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; + mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; +-----------------------------------------------+ | Explain String | +-----------------------------------------------+ @@ -277,7 +277,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = | ------------PhysicalDistribute | | --------------PhysicalOlapScan[t3] | | | - | Used: leading(t1 { t2 t3 }) | + | Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +-----------------------------------------------+ @@ -286,7 +286,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = 3. Bushy 树 ```sql - mysql> explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; + mysql> explain shape plan select /*+ leading((t1 t2) (t3 t4)) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +-----------------------------------------------+ | Explain String | +-----------------------------------------------+ @@ -313,7 +313,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = 4. zig-zag 树 ```sql - mysql> explain shape plan select /*+ leading(t1 {t2 t3} t4) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; + mysql> explain shape plan select /*+ leading(t1 (t2 t3) t4) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +--------------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +--------------------------------------------------------------------------------------+ @@ -348,7 +348,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = ```sql -------- test outer join which can not swap -- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) - mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; + mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; +--------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +--------------------------------------------------------------------------------+ @@ -365,7 +365,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = | | | Hint log: | | Used: | - | UnUsed: leading(t1 { t2 t3 }) | + | UnUsed: leading(t1 ( t2 t3 )) | | SyntaxError: | +--------------------------------------------------------------------------------+ ``` @@ -384,13 +384,13 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = -- (t1 leftjoin t2 on (P12)) leftjoin t3 on (P23) = t1 leftjoin (t2 leftjoin t3 on (P23)) on (P12) select /*+ leading(t2 t3 t1) SWAP_INPUT(t1) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; - explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; - explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; + explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; + explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; -------- test outer join which can not swap -- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) -- eliminated to inner join - explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; + explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; explain graph select /*+ leading(t1 t2 t3) */ * from t1 left join (select * from t2 join t3 on c2 = c3) on c1 = c2; -- test semi join diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/current/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md b/i18n/zh-CN/docusaurus-plugin-content-docs/current/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md index 2992ecf2fb45e..7658bab626145 100644 --- a/i18n/zh-CN/docusaurus-plugin-content-docs/current/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/current/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md @@ -105,7 +105,7 @@ mysql> explain shape plan select /*+ leading(t1 t2 t3) */ * from t1 join t2 on t ## 案例 3:强制生成右深树 ```sql -mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3; +mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3; +----------------------------------------------------------------------------------+ | _Explain_ String(Nereids Planner) | +----------------------------------------------------------------------------------+ @@ -121,18 +121,18 @@ mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on | --------------PhysicalOlapScan[t3] | | | | Hint log: | -| Used: leading(t1 { t2 t3 }) | +| Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +----------------------------------------------------------------------------------+ ``` -同样,Hint log 展示了应用成功的 hint: `Used: leading(t1 { t2 t3 })`。 +同样,Hint log 展示了应用成功的 hint: `Used: leading(t1 ( t2 t3 ))`。 ## 案例 4:强制生成 bushy 树 ```sql -mysql> explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3 join t4 on t3.c3 = t4.c4; +mysql> explain shape plan select /*+ leading((t1 t2) (t3 t4)) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3 join t4 on t3.c3 = t4.c4; +-----------------------------------------------+ | _Explain_ String | +-----------------------------------------------+ @@ -202,7 +202,7 @@ explain shape plan from ( select - /*+ leading(orders shuffle {lineitem shuffle part} shuffle {supplier broadcast nation} shuffle partsupp) */ + /*+ leading(orders [shuffle] (lineitem [shuffle] part) [shuffle] (supplier [broadcast] nation) [shuffle] partsupp) */ n_name as nation, extract(year from o_orderdate) as o_year, l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount @@ -230,7 +230,7 @@ explain shape plan o_year desc; ``` -上述 `/*+ leading(orders shuffle {lineitem shuffle part} shuffle {supplier broadcast nation} shuffle partsupp) */` hint 指定方式,混用了 leading 和 distribute hint 两种格式。leading 用于控制总体的表之间的相对 join 顺序,而 `shuffle` 和 `broadcast` 分别用于指定特定 join 使用何种 shuffle 方式。通过两种结合使用,可以灵活的控制连接顺序和连接方式,便于手工控制用户期望的计划行为。 +上述 `/*+ leading(orders [shuffle] (lineitem [shuffle] part) [shuffle] (supplier [broadcast] nation) [shuffle] partsupp) */` hint 指定方式,混用了 leading 和 distribute hint 两种格式。leading 用于控制总体的表之间的相对 join 顺序,而 `shuffle` 和 `broadcast` 分别用于指定特定 join 使用何种 shuffle 方式。通过两种结合使用,可以灵活的控制连接顺序和连接方式,便于手工控制用户期望的计划行为。 :::caution 使用建议 - 建议使用 EXPLAIN 来仔细分析执行计划,以确保 Leading Hint 能达到预期的效果。 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.0/query/join-optimization/join-hint.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.0/query/join-optimization/join-hint.md index b3b106d6a3645..8cdc445bce84a 100644 --- a/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.0/query/join-optimization/join-hint.md +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.0/query/join-optimization/join-hint.md @@ -150,7 +150,7 @@ mysql> explain shape plan select /*+ leading(t1 t2 t3) */ * from t1 join t2 on c 15 rows in set (0.00 sec) ``` -- 同时允许使用大括号指定 join 树形状。例:/*+ leading(t1 {t2 t3}) */ +- 同时允许使用大括号指定 join 树形状。例:/*+ leading(t1 (t2 t3)) */ join / \ t1 join @@ -158,7 +158,7 @@ mysql> explain shape plan select /*+ leading(t1 t2 t3) */ * from t1 join t2 on c t2 t3 ```sql -mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; +mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; +----------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +----------------------------------------------------------------------------------+ @@ -174,7 +174,7 @@ mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on | --------------PhysicalOlapScan[t3] | | | | Hint log: | -| Used: leading(t1 { t2 t3 }) | +| Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +----------------------------------------------------------------------------------+ @@ -331,7 +331,7 @@ mysql> explain shape plan select /*+ leading(t1 t2 t3) */ * from t1 join t2 on t 当我们想将计划的形状做成右深树或者 bushy 树或者 zigzag 树的时候,只需要加上大括号来限制 plan 的形状即可,不需要像 oracle 一样用 swap 从左深树一步步调整。 ```sql -mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; +mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; +-----------------------------------------------+ | Explain String | +-----------------------------------------------+ @@ -346,7 +346,7 @@ mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on | ------------PhysicalDistribute | | --------------PhysicalOlapScan[t3] | | | -| Used: leading(t1 { t2 t3 }) | +| Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +-----------------------------------------------+ @@ -356,7 +356,7 @@ mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on **Bushy 树** ```sql -mysql> explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +mysql> explain shape plan select /*+ leading((t1 t2) (t3 t4)) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +-----------------------------------------------+ | Explain String | +-----------------------------------------------+ @@ -384,7 +384,7 @@ mysql> explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join **Zig-Zag 树** ```sql -mysql> explain shape plan select /*+ leading(t1 {t2 t3} t4) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +mysql> explain shape plan select /*+ leading(t1 (t2 t3) t4) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +--------------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +--------------------------------------------------------------------------------------+ @@ -419,7 +419,7 @@ mysql> explain shape plan select /*+ leading(t1 {t2 t3} t4) */ * from t1 join t2 -- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) ```sql -mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; +mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; +--------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +--------------------------------------------------------------------------------+ @@ -436,7 +436,7 @@ mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join | | | Hint log: | | Used: | -| UnUsed: leading(t1 { t2 t3 }) | +| UnUsed: leading(t1 ( t2 t3 )) | | SyntaxError: | +--------------------------------------------------------------------------------+ 15 rows in set (0.01 sec) @@ -456,13 +456,13 @@ explain shape plan select /*+ leading(t1 t3 t2) */ * from t1 left join t2 on c1 -- (t1 leftjoin t2 on (P12)) leftjoin t3 on (P23) = t1 leftjoin (t2 leftjoin t3 on (P23)) on (P12) select /*+ leading(t2 t3 t1) SWAP_INPUT(t1) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; -explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; -explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; +explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; +explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; -------- test outer join which can not swap -- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) -- eliminated to inner join -explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; +explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; explain graph select /*+ leading(t1 t2 t3) */ * from t1 left join (select * from t2 join t3 on c2 = c3) on c1 = c2; -- test semi join diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/query-acceleration/hints/distribute-hint.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/query-acceleration/hints/distribute-hint.md index 4b8d5ae99f4fa..b07c812153e54 100644 --- a/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/query-acceleration/hints/distribute-hint.md +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/query-acceleration/hints/distribute-hint.md @@ -106,7 +106,7 @@ explain shape plan from ( select - /*+ leading(orders shuffle {lineitem shuffle part} shuffle {supplier broadcast nation} shuffle partsupp) */ + /*+ leading(orders [shuffle] (lineitem [shuffle] part) [shuffle] (supplier [broadcast] nation) [shuffle] partsupp) */ n_name as nation, extract(year from o_orderdate) as o_year, l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/query-acceleration/hints/leading-hint.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/query-acceleration/hints/leading-hint.md index 3d9e27a9d215f..9aed56ed40237 100644 --- a/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/query-acceleration/hints/leading-hint.md +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/query-acceleration/hints/leading-hint.md @@ -100,7 +100,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = 2. 同时允许使用大括号指定 Join 树形状: ```sql - mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; + mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; +----------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +----------------------------------------------------------------------------------+ @@ -116,7 +116,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = | --------------PhysicalOlapScan[t3] | | | | Hint log: | - | Used: leading(t1 { t2 t3 }) | + | Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +----------------------------------------------------------------------------------+ @@ -262,7 +262,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = 当需要将计划的形状做成右深树、Bushy 树或者 zig-zag 树时,只需加上大括号来限制 plan 的形状即可,无需像 Oracle 使用 swap 从左深树一步步调整。 ```sql - mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; + mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; +-----------------------------------------------+ | Explain String | +-----------------------------------------------+ @@ -277,7 +277,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = | ------------PhysicalDistribute | | --------------PhysicalOlapScan[t3] | | | - | Used: leading(t1 { t2 t3 }) | + | Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +-----------------------------------------------+ @@ -286,7 +286,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = 3. Bushy 树 ```sql - mysql> explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; + mysql> explain shape plan select /*+ leading((t1 t2) (t3 t4)) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +-----------------------------------------------+ | Explain String | +-----------------------------------------------+ @@ -313,7 +313,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = 4. zig-zag 树 ```sql - mysql> explain shape plan select /*+ leading(t1 {t2 t3} t4) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; + mysql> explain shape plan select /*+ leading(t1 (t2 t3) t4) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +--------------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +--------------------------------------------------------------------------------------+ @@ -348,7 +348,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = ```sql -------- test outer join which can not swap -- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) - mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; + mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; +--------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +--------------------------------------------------------------------------------+ @@ -365,7 +365,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = | | | Hint log: | | Used: | - | UnUsed: leading(t1 { t2 t3 }) | + | UnUsed: leading(t1 ( t2 t3 )) | | SyntaxError: | +--------------------------------------------------------------------------------+ ``` @@ -384,13 +384,13 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = -- (t1 leftjoin t2 on (P12)) leftjoin t3 on (P23) = t1 leftjoin (t2 leftjoin t3 on (P23)) on (P12) select /*+ leading(t2 t3 t1) SWAP_INPUT(t1) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; - explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; - explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; + explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; + explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; -------- test outer join which can not swap -- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) -- eliminated to inner join - explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; + explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; explain graph select /*+ leading(t1 t2 t3) */ * from t1 left join (select * from t2 join t3 on c2 = c3) on c1 = c2; -- test semi join diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md index 2992ecf2fb45e..7658bab626145 100644 --- a/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-2.1/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md @@ -105,7 +105,7 @@ mysql> explain shape plan select /*+ leading(t1 t2 t3) */ * from t1 join t2 on t ## 案例 3:强制生成右深树 ```sql -mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3; +mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3; +----------------------------------------------------------------------------------+ | _Explain_ String(Nereids Planner) | +----------------------------------------------------------------------------------+ @@ -121,18 +121,18 @@ mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on | --------------PhysicalOlapScan[t3] | | | | Hint log: | -| Used: leading(t1 { t2 t3 }) | +| Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +----------------------------------------------------------------------------------+ ``` -同样,Hint log 展示了应用成功的 hint: `Used: leading(t1 { t2 t3 })`。 +同样,Hint log 展示了应用成功的 hint: `Used: leading(t1 ( t2 t3 ))`。 ## 案例 4:强制生成 bushy 树 ```sql -mysql> explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3 join t4 on t3.c3 = t4.c4; +mysql> explain shape plan select /*+ leading((t1 t2) (t3 t4)) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3 join t4 on t3.c3 = t4.c4; +-----------------------------------------------+ | _Explain_ String | +-----------------------------------------------+ @@ -202,7 +202,7 @@ explain shape plan from ( select - /*+ leading(orders shuffle {lineitem shuffle part} shuffle {supplier broadcast nation} shuffle partsupp) */ + /*+ leading(orders [shuffle] (lineitem [shuffle] part) [shuffle] (supplier [broadcast] nation) [shuffle] partsupp) */ n_name as nation, extract(year from o_orderdate) as o_year, l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount @@ -230,7 +230,7 @@ explain shape plan o_year desc; ``` -上述 `/*+ leading(orders shuffle {lineitem shuffle part} shuffle {supplier broadcast nation} shuffle partsupp) */` hint 指定方式,混用了 leading 和 distribute hint 两种格式。leading 用于控制总体的表之间的相对 join 顺序,而 `shuffle` 和 `broadcast` 分别用于指定特定 join 使用何种 shuffle 方式。通过两种结合使用,可以灵活的控制连接顺序和连接方式,便于手工控制用户期望的计划行为。 +上述 `/*+ leading(orders [shuffle] (lineitem [shuffle] part) [shuffle] (supplier [broadcast] nation) [shuffle] partsupp) */` hint 指定方式,混用了 leading 和 distribute hint 两种格式。leading 用于控制总体的表之间的相对 join 顺序,而 `shuffle` 和 `broadcast` 分别用于指定特定 join 使用何种 shuffle 方式。通过两种结合使用,可以灵活的控制连接顺序和连接方式,便于手工控制用户期望的计划行为。 :::caution 使用建议 - 建议使用 EXPLAIN 来仔细分析执行计划,以确保 Leading Hint 能达到预期的效果。 diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-3.0/query-acceleration/hints/distribute-hint.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-3.0/query-acceleration/hints/distribute-hint.md index 4b8d5ae99f4fa..b07c812153e54 100644 --- a/i18n/zh-CN/docusaurus-plugin-content-docs/version-3.0/query-acceleration/hints/distribute-hint.md +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-3.0/query-acceleration/hints/distribute-hint.md @@ -106,7 +106,7 @@ explain shape plan from ( select - /*+ leading(orders shuffle {lineitem shuffle part} shuffle {supplier broadcast nation} shuffle partsupp) */ + /*+ leading(orders [shuffle] (lineitem [shuffle] part) [shuffle] (supplier [broadcast] nation) [shuffle] partsupp) */ n_name as nation, extract(year from o_orderdate) as o_year, l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-3.0/query-acceleration/hints/leading-hint.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-3.0/query-acceleration/hints/leading-hint.md index 3d9e27a9d215f..9aed56ed40237 100644 --- a/i18n/zh-CN/docusaurus-plugin-content-docs/version-3.0/query-acceleration/hints/leading-hint.md +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-3.0/query-acceleration/hints/leading-hint.md @@ -100,7 +100,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = 2. 同时允许使用大括号指定 Join 树形状: ```sql - mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; + mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; +----------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +----------------------------------------------------------------------------------+ @@ -116,7 +116,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = | --------------PhysicalOlapScan[t3] | | | | Hint log: | - | Used: leading(t1 { t2 t3 }) | + | Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +----------------------------------------------------------------------------------+ @@ -262,7 +262,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = 当需要将计划的形状做成右深树、Bushy 树或者 zig-zag 树时,只需加上大括号来限制 plan 的形状即可,无需像 Oracle 使用 swap 从左深树一步步调整。 ```sql - mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; + mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; +-----------------------------------------------+ | Explain String | +-----------------------------------------------+ @@ -277,7 +277,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = | ------------PhysicalDistribute | | --------------PhysicalOlapScan[t3] | | | - | Used: leading(t1 { t2 t3 }) | + | Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +-----------------------------------------------+ @@ -286,7 +286,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = 3. Bushy 树 ```sql - mysql> explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; + mysql> explain shape plan select /*+ leading((t1 t2) (t3 t4)) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +-----------------------------------------------+ | Explain String | +-----------------------------------------------+ @@ -313,7 +313,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = 4. zig-zag 树 ```sql - mysql> explain shape plan select /*+ leading(t1 {t2 t3} t4) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; + mysql> explain shape plan select /*+ leading(t1 (t2 t3) t4) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +--------------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +--------------------------------------------------------------------------------------+ @@ -348,7 +348,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = ```sql -------- test outer join which can not swap -- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) - mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; + mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; +--------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +--------------------------------------------------------------------------------+ @@ -365,7 +365,7 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = | | | Hint log: | | Used: | - | UnUsed: leading(t1 { t2 t3 }) | + | UnUsed: leading(t1 ( t2 t3 )) | | SyntaxError: | +--------------------------------------------------------------------------------+ ``` @@ -384,13 +384,13 @@ mysql> explain shape plan select /*+ leading(t2 t1) */ * from t1 join t2 on c1 = -- (t1 leftjoin t2 on (P12)) leftjoin t3 on (P23) = t1 leftjoin (t2 leftjoin t3 on (P23)) on (P12) select /*+ leading(t2 t3 t1) SWAP_INPUT(t1) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; - explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; - explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; + explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; + explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; -------- test outer join which can not swap -- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) -- eliminated to inner join - explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; + explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; explain graph select /*+ leading(t1 t2 t3) */ * from t1 left join (select * from t2 join t3 on c2 = c3) on c1 = c2; -- test semi join diff --git a/i18n/zh-CN/docusaurus-plugin-content-docs/version-3.0/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md b/i18n/zh-CN/docusaurus-plugin-content-docs/version-3.0/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md index 2992ecf2fb45e..7658bab626145 100644 --- a/i18n/zh-CN/docusaurus-plugin-content-docs/version-3.0/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md +++ b/i18n/zh-CN/docusaurus-plugin-content-docs/version-3.0/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md @@ -105,7 +105,7 @@ mysql> explain shape plan select /*+ leading(t1 t2 t3) */ * from t1 join t2 on t ## 案例 3:强制生成右深树 ```sql -mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3; +mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3; +----------------------------------------------------------------------------------+ | _Explain_ String(Nereids Planner) | +----------------------------------------------------------------------------------+ @@ -121,18 +121,18 @@ mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on | --------------PhysicalOlapScan[t3] | | | | Hint log: | -| Used: leading(t1 { t2 t3 }) | +| Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +----------------------------------------------------------------------------------+ ``` -同样,Hint log 展示了应用成功的 hint: `Used: leading(t1 { t2 t3 })`。 +同样,Hint log 展示了应用成功的 hint: `Used: leading(t1 ( t2 t3 ))`。 ## 案例 4:强制生成 bushy 树 ```sql -mysql> explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3 join t4 on t3.c3 = t4.c4; +mysql> explain shape plan select /*+ leading((t1 t2) (t3 t4)) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3 join t4 on t3.c3 = t4.c4; +-----------------------------------------------+ | _Explain_ String | +-----------------------------------------------+ @@ -202,7 +202,7 @@ explain shape plan from ( select - /*+ leading(orders shuffle {lineitem shuffle part} shuffle {supplier broadcast nation} shuffle partsupp) */ + /*+ leading(orders [shuffle] (lineitem [shuffle] part) [shuffle] (supplier [broadcast] nation) [shuffle] partsupp) */ n_name as nation, extract(year from o_orderdate) as o_year, l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount @@ -230,7 +230,7 @@ explain shape plan o_year desc; ``` -上述 `/*+ leading(orders shuffle {lineitem shuffle part} shuffle {supplier broadcast nation} shuffle partsupp) */` hint 指定方式,混用了 leading 和 distribute hint 两种格式。leading 用于控制总体的表之间的相对 join 顺序,而 `shuffle` 和 `broadcast` 分别用于指定特定 join 使用何种 shuffle 方式。通过两种结合使用,可以灵活的控制连接顺序和连接方式,便于手工控制用户期望的计划行为。 +上述 `/*+ leading(orders [shuffle] (lineitem [shuffle] part) [shuffle] (supplier [broadcast] nation) [shuffle] partsupp) */` hint 指定方式,混用了 leading 和 distribute hint 两种格式。leading 用于控制总体的表之间的相对 join 顺序,而 `shuffle` 和 `broadcast` 分别用于指定特定 join 使用何种 shuffle 方式。通过两种结合使用,可以灵活的控制连接顺序和连接方式,便于手工控制用户期望的计划行为。 :::caution 使用建议 - 建议使用 EXPLAIN 来仔细分析执行计划,以确保 Leading Hint 能达到预期的效果。 diff --git a/versioned_docs/version-2.0/query/join-optimization/join-hint.md b/versioned_docs/version-2.0/query/join-optimization/join-hint.md index d2aca66189241..3af73a23f1f05 100644 --- a/versioned_docs/version-2.0/query/join-optimization/join-hint.md +++ b/versioned_docs/version-2.0/query/join-optimization/join-hint.md @@ -134,7 +134,7 @@ mysql> explain shape plan select /*+ leading(t1 t2 t3) */ * from t1 join t2 on c +--------------------------------------------------------------------------------+ 15 rows in set (0.00 sec) ``` -The join tree shape is also allowed to be specified using braces. For example: /*+ leading(t1 {t2 t3}) */ +The join tree shape is also allowed to be specified using braces. For example: /*+ leading(t1 (t2 t3)) */ ```sql join / \ @@ -142,7 +142,7 @@ The join tree shape is also allowed to be specified using braces. For example: / / \ t2 t3 -mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; +mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; +----------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +----------------------------------------------------------------------------------+ @@ -158,7 +158,7 @@ mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on | --------------PhysicalOlapScan[t3] | | | | Hint log: | -| Used: leading(t1 { t2 t3 }) | +| Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +----------------------------------------------------------------------------------+ @@ -297,7 +297,7 @@ mysql> explain shape plan select /*+ leading(t1 t2 t3) */ * from t1 join t2 on t ### Right deep tree When we want to make the shape of the plan into a right deep tree, bushy tree or zigzag tree, we only need to add curly brackets to limit the shape of the plan, instead of using swap to adjust from the left deep tree step by step like oracle. ```sql -mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; +mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; +-----------------------------------------------+ | Explain String | +-----------------------------------------------+ @@ -312,7 +312,7 @@ mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on | ------------PhysicalDistribute | | --------------PhysicalOlapScan[t3] | | | -| Used: leading(t1 { t2 t3 }) | +| Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +-----------------------------------------------+ @@ -320,7 +320,7 @@ mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on ``` ### Bushy tree ```sql -mysql> explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +mysql> explain shape plan select /*+ leading((t1 t2) (t3 t4)) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +-----------------------------------------------+ | Explain String | +-----------------------------------------------+ @@ -346,7 +346,7 @@ mysql> explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join ``` ### Zig-Zag Tree ```sql -mysql> explain shape plan select /*+ leading(t1 {t2 t3} t4) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +mysql> explain shape plan select /*+ leading(t1 (t2 t3) t4) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +--------------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +--------------------------------------------------------------------------------------+ @@ -379,7 +379,7 @@ Here are examples of things that can't be exchanged: -------- test outer join which can not swap -- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) ```sql -mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; +mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; +--------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +--------------------------------------------------------------------------------+ @@ -396,7 +396,7 @@ mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join | | | Hint log: | | Used: | -| UnUsed: leading(t1 { t2 t3 }) | +| UnUsed: leading(t1 ( t2 t3 )) | | SyntaxError: | +--------------------------------------------------------------------------------+ 15 rows in set (0.01 sec) @@ -414,13 +414,13 @@ explain shape plan select /*+ leading(t1 t3 t2) */ * from t1 left join t2 on c1 -- (t1 leftjoin t2 on (P12)) leftjoin t3 on (P23) = t1 leftjoin (t2 leftjoin t3 on (P23)) on (P12) select /*+ leading(t2 t3 t1) SWAP_INPUT(t1) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; -explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; -explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; +explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; +explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; -------- test outer join which can not swap -- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) -- eliminated to inner join -explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; +explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; explain graph select /*+ leading(t1 t2 t3) */ * from t1 left join (select * from t2 join t3 on c2 = c3) on c1 = c2; -- test semi join diff --git a/versioned_docs/version-2.1/query-acceleration/hints/distribute-hint.md b/versioned_docs/version-2.1/query-acceleration/hints/distribute-hint.md index c5bec263c42e4..3e13e5a925a68 100644 --- a/versioned_docs/version-2.1/query-acceleration/hints/distribute-hint.md +++ b/versioned_docs/version-2.1/query-acceleration/hints/distribute-hint.md @@ -105,7 +105,7 @@ explain shape plan from ( select - /*+ leading(orders shuffle {lineitem shuffle part} shuffle {supplier broadcast nation} shuffle partsupp) */ + /*+ leading(orders [shuffle] (lineitem [shuffle] part) [shuffle] (supplier [broadcast] nation) [shuffle] partsupp) */ n_name as nation, extract(year from o_orderdate) as o_year, l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount diff --git a/versioned_docs/version-2.1/query-acceleration/hints/leading-hint.md b/versioned_docs/version-2.1/query-acceleration/hints/leading-hint.md index a2ec59c015516..ee60db438b432 100644 --- a/versioned_docs/version-2.1/query-acceleration/hints/leading-hint.md +++ b/versioned_docs/version-2.1/query-acceleration/hints/leading-hint.md @@ -99,7 +99,7 @@ When Leading Hint is not effective, the normal process will be used to generate 2. At the same time, curly braces can be used to specify the shape of the Join tree: ```sql - mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; + mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; +----------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +----------------------------------------------------------------------------------+ @@ -115,7 +115,7 @@ When Leading Hint is not effective, the normal process will be used to generate | --------------PhysicalOlapScan[t3] | | | | Hint log: | - | Used: leading(t1 { t2 t3 }) | + | Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +----------------------------------------------------------------------------------+ @@ -262,7 +262,7 @@ When Leading Hint is not effective, the normal process will be used to generate When you need to make the shape of the plan a right-deep tree, Bushy tree, or zig-zag tree, you only need to add curly braces to limit the shape of the plan, without the need to use swap like Oracle to adjust step by step from the left-deep tree. ```sql - mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; + mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; +-----------------------------------------------+ | Explain String | +-----------------------------------------------+ @@ -277,7 +277,7 @@ When Leading Hint is not effective, the normal process will be used to generate | ------------PhysicalDistribute | | --------------PhysicalOlapScan[t3] | | | - | Used: leading(t1 { t2 t3 }) | + | Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +-----------------------------------------------+ @@ -286,7 +286,7 @@ When Leading Hint is not effective, the normal process will be used to generate 3. Bushy Tree ```sql - mysql> explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; + mysql> explain shape plan select /*+ leading((t1 t2) (t3 t4)) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +-----------------------------------------------+ | Explain String | +-----------------------------------------------+ @@ -313,7 +313,7 @@ When Leading Hint is not effective, the normal process will be used to generate 4. zig-zag tree ```sql - mysql> explain shape plan select /*+ leading(t1 {t2 t3} t4) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; + mysql> explain shape plan select /*+ leading(t1 (t2 t3) t4) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +--------------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +--------------------------------------------------------------------------------------+ @@ -347,7 +347,7 @@ When Leading Hint is not effective, the normal process will be used to generate ```sql -------- test outer join which can not swap -- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) - mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; + mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; +--------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +--------------------------------------------------------------------------------+ @@ -364,7 +364,7 @@ When Leading Hint is not effective, the normal process will be used to generate | | | Hint log: | | Used: | - | UnUsed: leading(t1 { t2 t3 }) | + | UnUsed: leading(t1 ( t2 t3 )) | | SyntaxError: | +--------------------------------------------------------------------------------+ ``` @@ -383,13 +383,13 @@ When Leading Hint is not effective, the normal process will be used to generate -- (t1 leftjoin t2 on (P12)) leftjoin t3 on (P23) = t1 leftjoin (t2 leftjoin t3 on (P23)) on (P12) select /*+ leading(t2 t3 t1) SWAP_INPUT(t1) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; - explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; - explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; + explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; + explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; -------- test outer join which can not swap -- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) -- eliminated to inner join - explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; + explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; explain graph select /*+ leading(t1 t2 t3) */ * from t1 left join (select * from t2 join t3 on c2 = c3) on c1 = c2; -- test semi join diff --git a/versioned_docs/version-2.1/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md b/versioned_docs/version-2.1/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md index dc743a8975f0d..03e996282235d 100644 --- a/versioned_docs/version-2.1/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md +++ b/versioned_docs/version-2.1/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md @@ -105,7 +105,7 @@ Similarly, the Hint log shows the successfully applied hint: `Used: leading(t1 t ## Case 3: Forcing the Generation of a Right-Deep Tree ```sql -mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3; +mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3; +----------------------------------------------------------------------------------+ | _Explain_ String(Nereids Planner) | +----------------------------------------------------------------------------------+ @@ -121,18 +121,18 @@ mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on | --------------PhysicalOlapScan[t3] | | | | Hint log: | -| Used: leading(t1 { t2 t3 }) | +| Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +----------------------------------------------------------------------------------+ ``` -Similarly, the Hint log shows the successfully applied hint: `Used: leading(t1 { t2 t3 })`. +Similarly, the Hint log shows the successfully applied hint: `Used: leading(t1 ( t2 t3 ))`. ## Case 4: Forcing the Generation of a Bushy Tree ```sql -mysql> explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3 join t4 on t3.c3 = t4.c4; +mysql> explain shape plan select /*+ leading((t1 t2) (t3 t4)) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3 join t4 on t3.c3 = t4.c4; +-----------------------------------------------+ | _Explain_ String | +-----------------------------------------------+ @@ -202,7 +202,7 @@ explain shape plan from ( select - /*+ leading(orders shuffle {lineitem shuffle part} shuffle {supplier broadcast nation} shuffle partsupp) */ + /*+ leading(orders [shuffle] (lineitem [shuffle] part) [shuffle] (supplier [broadcast] nation) [shuffle] partsupp) */ n_name as nation, extract(year from o_orderdate) as o_year, l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount @@ -230,7 +230,7 @@ explain shape plan o_year desc; ``` -The above hint specification `/*+ leading(orders shuffle {lineitem shuffle part} shuffle {supplier broadcast nation} shuffle partsupp) */` mixes the two formats of leading and distribute hint. Leading is used to control the relative join order among the overall tables, while shuffle and broadcast are used to specify the shuffle method for specific joins. By combining the two, the connection order and connection method can be flexibly controlled, making it convenient to manually control the expected plan behavior of the user. +The above hint specification `/*+ leading(orders [shuffle] (lineitem [shuffle] part) [shuffle] (supplier [broadcast] nation) [shuffle] partsupp) */` mixes the two formats of leading and distribute hint. Leading is used to control the relative join order among the overall tables, while shuffle and broadcast are used to specify the shuffle method for specific joins. By combining the two, the connection order and connection method can be flexibly controlled, making it convenient to manually control the expected plan behavior of the user. :::caution Usage Suggestions - It is recommended to use EXPLAIN to carefully analyze the execution plan to ensure that the Leading Hint can achieve the expected effect. diff --git a/versioned_docs/version-3.0/query-acceleration/hints/distribute-hint.md b/versioned_docs/version-3.0/query-acceleration/hints/distribute-hint.md index c5bec263c42e4..3e13e5a925a68 100644 --- a/versioned_docs/version-3.0/query-acceleration/hints/distribute-hint.md +++ b/versioned_docs/version-3.0/query-acceleration/hints/distribute-hint.md @@ -105,7 +105,7 @@ explain shape plan from ( select - /*+ leading(orders shuffle {lineitem shuffle part} shuffle {supplier broadcast nation} shuffle partsupp) */ + /*+ leading(orders [shuffle] (lineitem [shuffle] part) [shuffle] (supplier [broadcast] nation) [shuffle] partsupp) */ n_name as nation, extract(year from o_orderdate) as o_year, l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount diff --git a/versioned_docs/version-3.0/query-acceleration/hints/leading-hint.md b/versioned_docs/version-3.0/query-acceleration/hints/leading-hint.md index a2ec59c015516..ee60db438b432 100644 --- a/versioned_docs/version-3.0/query-acceleration/hints/leading-hint.md +++ b/versioned_docs/version-3.0/query-acceleration/hints/leading-hint.md @@ -99,7 +99,7 @@ When Leading Hint is not effective, the normal process will be used to generate 2. At the same time, curly braces can be used to specify the shape of the Join tree: ```sql - mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; + mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on c1 = c2 join t3 on c2=c3; +----------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +----------------------------------------------------------------------------------+ @@ -115,7 +115,7 @@ When Leading Hint is not effective, the normal process will be used to generate | --------------PhysicalOlapScan[t3] | | | | Hint log: | - | Used: leading(t1 { t2 t3 }) | + | Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +----------------------------------------------------------------------------------+ @@ -262,7 +262,7 @@ When Leading Hint is not effective, the normal process will be used to generate When you need to make the shape of the plan a right-deep tree, Bushy tree, or zig-zag tree, you only need to add curly braces to limit the shape of the plan, without the need to use swap like Oracle to adjust step by step from the left-deep tree. ```sql - mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; + mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3; +-----------------------------------------------+ | Explain String | +-----------------------------------------------+ @@ -277,7 +277,7 @@ When Leading Hint is not effective, the normal process will be used to generate | ------------PhysicalDistribute | | --------------PhysicalOlapScan[t3] | | | - | Used: leading(t1 { t2 t3 }) | + | Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +-----------------------------------------------+ @@ -286,7 +286,7 @@ When Leading Hint is not effective, the normal process will be used to generate 3. Bushy Tree ```sql - mysql> explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; + mysql> explain shape plan select /*+ leading((t1 t2) (t3 t4)) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +-----------------------------------------------+ | Explain String | +-----------------------------------------------+ @@ -313,7 +313,7 @@ When Leading Hint is not effective, the normal process will be used to generate 4. zig-zag tree ```sql - mysql> explain shape plan select /*+ leading(t1 {t2 t3} t4) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; + mysql> explain shape plan select /*+ leading(t1 (t2 t3) t4) */ * from t1 join t2 on t1.c1 = c2 join t3 on c2 = c3 join t4 on c3 = c4; +--------------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +--------------------------------------------------------------------------------------+ @@ -347,7 +347,7 @@ When Leading Hint is not effective, the normal process will be used to generate ```sql -------- test outer join which can not swap -- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) - mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; + mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; +--------------------------------------------------------------------------------+ | Explain String(Nereids Planner) | +--------------------------------------------------------------------------------+ @@ -364,7 +364,7 @@ When Leading Hint is not effective, the normal process will be used to generate | | | Hint log: | | Used: | - | UnUsed: leading(t1 { t2 t3 }) | + | UnUsed: leading(t1 ( t2 t3 )) | | SyntaxError: | +--------------------------------------------------------------------------------+ ``` @@ -383,13 +383,13 @@ When Leading Hint is not effective, the normal process will be used to generate -- (t1 leftjoin t2 on (P12)) leftjoin t3 on (P23) = t1 leftjoin (t2 leftjoin t3 on (P23)) on (P12) select /*+ leading(t2 t3 t1) SWAP_INPUT(t1) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; - explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; - explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; + explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; + explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 left join t3 on c2 = c3; -------- test outer join which can not swap -- t1 leftjoin (t2 join t3 on (P23)) on (P12) != (t1 leftjoin t2 on (P12)) join t3 on (P23) -- eliminated to inner join - explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; + explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 left join t2 on c1 = c2 join t3 on c2 = c3; explain graph select /*+ leading(t1 t2 t3) */ * from t1 left join (select * from t2 join t3 on c2 = c3) on c1 = c2; -- test semi join diff --git a/versioned_docs/version-3.0/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md b/versioned_docs/version-3.0/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md index dc743a8975f0d..03e996282235d 100644 --- a/versioned_docs/version-3.0/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md +++ b/versioned_docs/version-3.0/query-acceleration/tuning/tuning-plan/reordering-join-with-leading-hint.md @@ -105,7 +105,7 @@ Similarly, the Hint log shows the successfully applied hint: `Used: leading(t1 t ## Case 3: Forcing the Generation of a Right-Deep Tree ```sql -mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3; +mysql> explain shape plan select /*+ leading(t1 (t2 t3)) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3; +----------------------------------------------------------------------------------+ | _Explain_ String(Nereids Planner) | +----------------------------------------------------------------------------------+ @@ -121,18 +121,18 @@ mysql> explain shape plan select /*+ leading(t1 {t2 t3}) */ * from t1 join t2 on | --------------PhysicalOlapScan[t3] | | | | Hint log: | -| Used: leading(t1 { t2 t3 }) | +| Used: leading(t1 ( t2 t3 )) | | UnUsed: | | SyntaxError: | +----------------------------------------------------------------------------------+ ``` -Similarly, the Hint log shows the successfully applied hint: `Used: leading(t1 { t2 t3 })`. +Similarly, the Hint log shows the successfully applied hint: `Used: leading(t1 ( t2 t3 ))`. ## Case 4: Forcing the Generation of a Bushy Tree ```sql -mysql> explain shape plan select /*+ leading({t1 t2} {t3 t4}) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3 join t4 on t3.c3 = t4.c4; +mysql> explain shape plan select /*+ leading((t1 t2) (t3 t4)) */ * from t1 join t2 on t1.c1 = t2.c2 join t3 on t2.c2 = t3.c3 join t4 on t3.c3 = t4.c4; +-----------------------------------------------+ | _Explain_ String | +-----------------------------------------------+ @@ -202,7 +202,7 @@ explain shape plan from ( select - /*+ leading(orders shuffle {lineitem shuffle part} shuffle {supplier broadcast nation} shuffle partsupp) */ + /*+ leading(orders [shuffle] (lineitem [shuffle] part) [shuffle] (supplier [broadcast] nation) [shuffle] partsupp) */ n_name as nation, extract(year from o_orderdate) as o_year, l_extendedprice * (1 - l_discount) - ps_supplycost * l_quantity as amount @@ -230,7 +230,7 @@ explain shape plan o_year desc; ``` -The above hint specification `/*+ leading(orders shuffle {lineitem shuffle part} shuffle {supplier broadcast nation} shuffle partsupp) */` mixes the two formats of leading and distribute hint. Leading is used to control the relative join order among the overall tables, while shuffle and broadcast are used to specify the shuffle method for specific joins. By combining the two, the connection order and connection method can be flexibly controlled, making it convenient to manually control the expected plan behavior of the user. +The above hint specification `/*+ leading(orders [shuffle] (lineitem [shuffle] part) [shuffle] (supplier [broadcast] nation) [shuffle] partsupp) */` mixes the two formats of leading and distribute hint. Leading is used to control the relative join order among the overall tables, while shuffle and broadcast are used to specify the shuffle method for specific joins. By combining the two, the connection order and connection method can be flexibly controlled, making it convenient to manually control the expected plan behavior of the user. :::caution Usage Suggestions - It is recommended to use EXPLAIN to carefully analyze the execution plan to ensure that the Leading Hint can achieve the expected effect.