From 1fe3bb5a545a7af973a9d96f1c397155d7e0314f Mon Sep 17 00:00:00 2001 From: xixirangrang Date: Sat, 7 Oct 2023 13:36:22 +0800 Subject: [PATCH 1/4] This is an automated cherry-pick of #15105 Signed-off-by: ti-chi-bot --- optimizer-hints.md | 27 +++++++++++++++++++++++++++ system-variables.md | 22 ++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/optimizer-hints.md b/optimizer-hints.md index 7e559a53ec3a..eb8df39f5222 100644 --- a/optimizer-hints.md +++ b/optimizer-hints.md @@ -940,3 +940,30 @@ EXPLAIN SELECT /*+ leading(t1, t3), inl_join(t3) */ * FROM t1, t2, t3 WHERE t1.i +---------------------------------+----------+-----------+---------------+---------------------------------------------------------------------------------------------------------------------+ 9 rows in set (0.01 sec) ``` +<<<<<<< HEAD +======= + +### 使用 Hint 导致错误 `Can't find a proper physical plan for this query` + +在下面几种情况下,可能会出现 `Can't find a proper physical plan for this query` 错误: + +- 查询本身并不需要按顺序读取索引,即在不使用 Hint 的前提下,优化器在任何情况下都不会生成按顺序读取索引的计划。此时,如果指定了 `ORDER_INDEX` Hint,会出现此报错,此时应考虑移除对应的 `ORDER_INDEX` Hint。 +- 查询使用了 `NO_JOIN` 相关的 Hint 排除了所有可能的 Join 方式。 + +```sql +CREATE TABLE t1 (a INT); +CREATE TABLE t2 (a INT); +EXPLAIN SELECT /*+ NO_HASH_JOIN(t1), NO_MERGE_JOIN(t1) */ * FROM t1, t2 WHERE t1.a=t2.a; +ERROR 1815 (HY000): Internal : Can't find a proper physical plan for this query +``` + +- 系统变量 [`tidb_opt_enable_hash_join`](/system-variables.md#tidb_opt_enable_hash_join-从-v740-版本开始引入) 设置为 `OFF`,而且其他 Join 方式也都被排除了。 + +```sql +CREATE TABLE t1 (a INT); +CREATE TABLE t2 (a INT); +set tidb_opt_enable_hash_join=off; +EXPLAIN SELECT /*+ NO_MERGE_JOIN(t1) */ * FROM t1, t2 WHERE t1.a=t2.a; +ERROR 1815 (HY000): Internal : Can't find a proper physical plan for this query +``` +>>>>>>> 9dbe63e745 (sysvar: add system variable `tidb_opt_enable_hash_join` (#15105)) diff --git a/system-variables.md b/system-variables.md index ba24ed4a9e12..c9c343d91f98 100644 --- a/system-variables.md +++ b/system-variables.md @@ -2900,6 +2900,28 @@ mysql> desc select count(distinct a) from test.t; - 默认值:`ON` - 这个变量用来控制优化器是否开启交叉估算。 +<<<<<<< HEAD +======= +### `tidb_opt_enable_hash_join` 从 v7.4.0 版本开始引入 + +- 作用域:SESSION | GLOBAL +- 是否持久化到集群:是 +- 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否 +- 类型:布尔型 +- 默认值:`ON` +- 控制优化器是否会选择表的哈希连接。默认打开 (`ON`)。设置为 `OFF` 时,优化器在生成执行计划时会避免选择表的哈希连接,除非没有其他连接方式可用。 +- 如果同时使用了 `tidb_opt_enable_hash_join` 和 `HASH_JOIN` Hint,则 `HASH_JOIN` Hint 优先级更高。即使 `tidb_opt_enable_hash_join` 被设置为 `OFF`,如果在查询中指定了 `HASH_JOIN` Hint,TiDB 优化器仍然会强制执行哈希连接计划。 + +### `tidb_opt_enable_non_eval_scalar_subquery` 从 v7.3.0 版本开始引入 + +- 作用域:SESSION | GLOBAL +- 是否持久化到集群:是 +- 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否 +- 类型:布尔型 +- 默认值:`OFF` +- 这个变量用来控制 `EXPLAIN` 语句是否禁止提前执行可以在优化阶段展开的常量子查询。该变量设置为 `OFF` 时,`EXPLAIN` 语句会在优化阶段提前展开子查询。该变量设置为 `ON` 时,`EXPLAIN` 语句不会在优化阶段展开子查询。更多信息请参考[禁止子查询提前展开](/explain-walkthrough.md#禁止子查询提前执行)。 + +>>>>>>> 9dbe63e745 (sysvar: add system variable `tidb_opt_enable_hash_join` (#15105)) ### `tidb_opt_enable_late_materialization` 从 v7.0.0 版本开始引入 - 作用域:SESSION | GLOBAL From 7d100679b5e7fa7ba796b255a0faf26fd4fa432b Mon Sep 17 00:00:00 2001 From: xixirangrang Date: Tue, 17 Oct 2023 20:10:43 +0800 Subject: [PATCH 2/4] Apply suggestions from code review --- optimizer-hints.md | 3 --- system-variables.md | 14 +------------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/optimizer-hints.md b/optimizer-hints.md index eb8df39f5222..ed4aa63cff48 100644 --- a/optimizer-hints.md +++ b/optimizer-hints.md @@ -940,8 +940,6 @@ EXPLAIN SELECT /*+ leading(t1, t3), inl_join(t3) */ * FROM t1, t2, t3 WHERE t1.i +---------------------------------+----------+-----------+---------------+---------------------------------------------------------------------------------------------------------------------+ 9 rows in set (0.01 sec) ``` -<<<<<<< HEAD -======= ### 使用 Hint 导致错误 `Can't find a proper physical plan for this query` @@ -966,4 +964,3 @@ set tidb_opt_enable_hash_join=off; EXPLAIN SELECT /*+ NO_MERGE_JOIN(t1) */ * FROM t1, t2 WHERE t1.a=t2.a; ERROR 1815 (HY000): Internal : Can't find a proper physical plan for this query ``` ->>>>>>> 9dbe63e745 (sysvar: add system variable `tidb_opt_enable_hash_join` (#15105)) diff --git a/system-variables.md b/system-variables.md index c9c343d91f98..d1d19c069e30 100644 --- a/system-variables.md +++ b/system-variables.md @@ -2900,9 +2900,7 @@ mysql> desc select count(distinct a) from test.t; - 默认值:`ON` - 这个变量用来控制优化器是否开启交叉估算。 -<<<<<<< HEAD -======= -### `tidb_opt_enable_hash_join` 从 v7.4.0 版本开始引入 +### `tidb_opt_enable_hash_join` 从 v7.1.2 版本开始引入 - 作用域:SESSION | GLOBAL - 是否持久化到集群:是 @@ -2912,16 +2910,6 @@ mysql> desc select count(distinct a) from test.t; - 控制优化器是否会选择表的哈希连接。默认打开 (`ON`)。设置为 `OFF` 时,优化器在生成执行计划时会避免选择表的哈希连接,除非没有其他连接方式可用。 - 如果同时使用了 `tidb_opt_enable_hash_join` 和 `HASH_JOIN` Hint,则 `HASH_JOIN` Hint 优先级更高。即使 `tidb_opt_enable_hash_join` 被设置为 `OFF`,如果在查询中指定了 `HASH_JOIN` Hint,TiDB 优化器仍然会强制执行哈希连接计划。 -### `tidb_opt_enable_non_eval_scalar_subquery` 从 v7.3.0 版本开始引入 - -- 作用域:SESSION | GLOBAL -- 是否持久化到集群:是 -- 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否 -- 类型:布尔型 -- 默认值:`OFF` -- 这个变量用来控制 `EXPLAIN` 语句是否禁止提前执行可以在优化阶段展开的常量子查询。该变量设置为 `OFF` 时,`EXPLAIN` 语句会在优化阶段提前展开子查询。该变量设置为 `ON` 时,`EXPLAIN` 语句不会在优化阶段展开子查询。更多信息请参考[禁止子查询提前展开](/explain-walkthrough.md#禁止子查询提前执行)。 - ->>>>>>> 9dbe63e745 (sysvar: add system variable `tidb_opt_enable_hash_join` (#15105)) ### `tidb_opt_enable_late_materialization` 从 v7.0.0 版本开始引入 - 作用域:SESSION | GLOBAL From bb05da722f7b861b016034f1fd1808e77b580e5e Mon Sep 17 00:00:00 2001 From: xixirangrang <35301108+hfxsd@users.noreply.github.com> Date: Tue, 17 Oct 2023 20:41:34 +0800 Subject: [PATCH 3/4] Update optimizer-hints.md --- optimizer-hints.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/optimizer-hints.md b/optimizer-hints.md index ed4aa63cff48..d47e9444c503 100644 --- a/optimizer-hints.md +++ b/optimizer-hints.md @@ -955,7 +955,7 @@ EXPLAIN SELECT /*+ NO_HASH_JOIN(t1), NO_MERGE_JOIN(t1) */ * FROM t1, t2 WHERE t1 ERROR 1815 (HY000): Internal : Can't find a proper physical plan for this query ``` -- 系统变量 [`tidb_opt_enable_hash_join`](/system-variables.md#tidb_opt_enable_hash_join-从-v740-版本开始引入) 设置为 `OFF`,而且其他 Join 方式也都被排除了。 +- 系统变量 [`tidb_opt_enable_hash_join`](/system-variables.md#tidb_opt_enable_hash_join-从-v712-版本开始引入) 设置为 `OFF`,而且其他 Join 方式也都被排除了。 ```sql CREATE TABLE t1 (a INT); From 7c6fa7eff66d192e834f803b2ea6861c2cd9852a Mon Sep 17 00:00:00 2001 From: xixirangrang <35301108+hfxsd@users.noreply.github.com> Date: Tue, 17 Oct 2023 20:42:11 +0800 Subject: [PATCH 4/4] Update system-variables.md --- system-variables.md | 1 - 1 file changed, 1 deletion(-) diff --git a/system-variables.md b/system-variables.md index d1d19c069e30..b6921a8db624 100644 --- a/system-variables.md +++ b/system-variables.md @@ -2904,7 +2904,6 @@ mysql> desc select count(distinct a) from test.t; - 作用域:SESSION | GLOBAL - 是否持久化到集群:是 -- 是否受 Hint [SET_VAR](/optimizer-hints.md#set_varvar_namevar_value) 控制:否 - 类型:布尔型 - 默认值:`ON` - 控制优化器是否会选择表的哈希连接。默认打开 (`ON`)。设置为 `OFF` 时,优化器在生成执行计划时会避免选择表的哈希连接,除非没有其他连接方式可用。