diff --git a/optimizer-hints.md b/optimizer-hints.md index e022f8ca70299..e1ac1327eeb28 100644 --- a/optimizer-hints.md +++ b/optimizer-hints.md @@ -938,3 +938,27 @@ EXPLAIN SELECT /*+ leading(t1, t3), inl_join(t3) */ * FROM t1, t2, t3 WHERE t1.i +---------------------------------+----------+-----------+---------------+---------------------------------------------------------------------------------------------------------------------+ 9 rows in set (0.01 sec) ``` + +### Using hints causes the `Can't find a proper physical plan for this query` error + +The `Can't find a proper physical plan for this query` error might occur in the following scenarios: + +- A query itself does not require reading indexes in order. That is, for this query, the optimizer does not generate a plan to read indexes in order in any case without using hints. In this case, if the `ORDER_INDEX` hint is specified, this error occurs. To resolve this issue, remove the corresponding `ORDER_INDEX` hint. +- A query excludes all possible join methods by using the `NO_JOIN` related hints. + +```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 +``` + +- The system variable [`tidb_opt_enable_hash_join`](/system-variables.md#tidb_opt_enable_hash_join-new-in-v712) is set to `OFF`, and all other join types are also excluded. + +```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 d3c7eb989d7f9..6cab19ab10d48 100644 --- a/system-variables.md +++ b/system-variables.md @@ -3449,6 +3449,15 @@ mysql> desc select count(distinct a) from test.t; - Default value: `ON` - This variable is used to control whether the optimizer estimates the number of rows based on column order correlation +### tidb_opt_enable_hash_join New in v7.1.2 + +- Scope: SESSION | GLOBAL +- Persists to cluster: Yes +- Type: Boolean +- Default value: `ON` +- This variable is used to control whether the optimizer selects hash joins for tables. The value is `ON` by default. If it is set to `OFF`, the optimizer avoids selecting hash joins when generating execution plans, unless no other join algorithm is available. +- If both the system variable `tidb_opt_enable_hash_join` and the `HASH_JOIN` hint are configured, the `HASH_JOIN` hint takes precedence. Even if `tidb_opt_enable_hash_join` is set to `OFF`, when you specify a `HASH_JOIN` hint in a query, the TiDB optimizer still enforces a hash join plan. + ### tidb_opt_enable_late_materialization New in v7.0.0 - Scope: SESSION | GLOBAL