Skip to content

Commit

Permalink
sysvar: add system variable tidb_opt_enable_hash_join (#15105) (#15265
Browse files Browse the repository at this point in the history
)
  • Loading branch information
ti-chi-bot authored Oct 17, 2023
1 parent 483bccd commit 2e0ba5b
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 0 deletions.
24 changes: 24 additions & 0 deletions optimizer-hints.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
```
9 changes: 9 additions & 0 deletions system-variables.md
Original file line number Diff line number Diff line change
Expand Up @@ -2900,6 +2900,15 @@ mysql> desc select count(distinct a) from test.t;
- 默认值:`ON`
- 这个变量用来控制优化器是否开启交叉估算。
### `tidb_opt_enable_hash_join` <span class="version-mark">从 v7.1.2 版本开始引入</span>
- 作用域: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` <span class="version-mark">从 v7.0.0 版本开始引入</span>
- 作用域:SESSION | GLOBAL
Expand Down

0 comments on commit 2e0ba5b

Please sign in to comment.