diff --git a/optimizer-hints.md b/optimizer-hints.md index 7e559a53ec3a..d47e9444c503 100644 --- a/optimizer-hints.md +++ b/optimizer-hints.md @@ -940,3 +940,27 @@ EXPLAIN SELECT /*+ leading(t1, t3), inl_join(t3) */ * FROM t1, t2, t3 WHERE t1.i +---------------------------------+----------+-----------+---------------+---------------------------------------------------------------------------------------------------------------------+ 9 rows in set (0.01 sec) ``` + +### 使用 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-从-v712-版本开始引入) 设置为 `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 +``` diff --git a/system-variables.md b/system-variables.md index ba24ed4a9e12..b6921a8db624 100644 --- a/system-variables.md +++ b/system-variables.md @@ -2900,6 +2900,15 @@ mysql> desc select count(distinct a) from test.t; - 默认值:`ON` - 这个变量用来控制优化器是否开启交叉估算。 +### `tidb_opt_enable_hash_join` 从 v7.1.2 版本开始引入 + +- 作用域:SESSION | GLOBAL +- 是否持久化到集群:是 +- 类型:布尔型 +- 默认值:`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_late_materialization` 从 v7.0.0 版本开始引入 - 作用域:SESSION | GLOBAL