pingcap / pingcap/tidb

Without fast path, planner may generate worse plan

Open
#60,809 3 comments 0 reactions 1 assignee Claimed by @qw4990 View on GitHub
severity/moderate sig/planner type/bug
Dominant language
Go
Stars
40.5k
Forks
6.2k
PR merge metrics
PR metrics pending

Description

## Bug Report

### 1. Minimal reproduce step (Required)

Compile the code in https://github.com/YangKeao/tidb/tree/test-no-fast-path branch, and use the tidb-server to run the following SQLs. Compare the result with master branch.

```
-- Redundant Limit/StreamAgg plan
create table index_prune(a bigint(20) NOT NULL, b bigint(20) NOT NULL, c tinyint(4) NOT NULL, primary key(a, b), index idx_b_c_a(b, c, a));
explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 1;
explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 0, 1;
explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 GROUP BY b;
drop table index_prune;

-- Redundant SelectLock
create table t(a bigint primary key);
explain format = 'brief' select * from t where a = 1 for update;
drop table t;

-- Redundant Projection
create table t(a int);
explain format = 'brief' select * from t where _tidb_rowid = 0;
drop table t;

create table t (a varchar(20), b int);
insert into t values("aaa", 12);
explain format = 'brief' select * from t where t._tidb_rowid = 1;
drop table t;

-- Redundant Selection
create table t(a int primary key auto_increment not null, b int, c int, unique key idx_abc(a, b, c));
insert into t values(1, 1, 1), (2, 2, 2), (3, 3, 3), (4, 4, 5);
explain format = 'brief' select * from t where (a, b, c) in ((1, 1, 1), (2, 2, 2));
drop table t;

-- Fail to use Batch_Point_Get
CREATE TABLE t1 (id int, c varchar(128), primary key (id)) PARTITION BY HASH (id) PARTITIONS 3;
insert into t1 values (1, "a"), (11, "b"), (21, "c");
explain format='brief' select * from t1 where id in (1, 1, 11);
explain format='brief' select * from t1 where id in (1, 11, 11, 21);
drop table t1;

CREATE TABLE t2 (id int, c varchar(128), primary key (id)) partition by range (id)(
partition p0 values less than (10),
partition p1 values less than (20),
partition p2 values less than (30));
insert into t2 values (1, "a"), (11, "b"), (21, "c");
explain format='brief' select * from t2 where id in (1, 1, 11);
explain format='brief' select * from t2 where id in (1, 1, 11);
drop table t2;

create table pt (a int, b int, c int, d int default 0, primary key (a, b) nonclustered, unique key uidx(c) global)
partition by range(a) (
PARTITION p0 VALUES LESS THAN (3),
PARTITION p1 VALUES LESS THAN (6),
PARTITION p2 VALUES LESS THAN (9),
PARTITION p3 VALUES LESS THAN (20)
);
insert into pt(a,b,c) values(1,1,1), (2,2,2), (3,3,3), (4,4,4), (5,5,5), (6,6,6), (7,7,7), (8,8,8), (9,9,9), (10,10,10);
analyze table pt;
explain select c from pt where c in (1,2,3);
alter table pt add unique index idx(a) global;
explain select * from pt where a in (1,2,3);
drop table pt;

-- Fail to generate TableDual
create table t(pk int1 primary key);
insert into t values(125);
explain format='brief' select * from t where pk = 9223372036854775807;
explain format='brief' select * from t where pk = 128;
drop table t;

create table t(pk int1 unsigned primary key);
explain format='brief' select * from t where pk = 256;
explain format='brief' select * from t where pk = 9223372036854775807;
explain format='brief' select * from t where pk = 9223372036854775808;
explain format='brief' select * from t where pk = 18446744073709551615;
drop table t;

-- Fail to use plan cache
create table t(pk int primary key);
insert into t values(1);
prepare stmt from 'select * from t where pk = ?';
set @a0=1.1, @a1='1.1', @a2=1, @a3=1.0, @a4='1.0';
execute stmt using @a3;
execute stmt using @a3;
select @@last_plan_from_cache;
execute stmt using @a4;
execute stmt using @a4;
select @@last_plan_from_cache;
drop table t;
```

### 2. What did you expect to see? (Required)

```
-- No Limit/StreamAgg
mysql> explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 1;
+-----------+---------+------+--------------------------------------------------+---------------+
| id | estRows | task | access object | operator info |
+-----------+---------+------+--------------------------------------------------+---------------+
| Point_Get | 1.00 | root | table:index_prune, clustered index:PRIMARY(a, b) | |
+-----------+---------+------+--------------------------------------------------+---------------+
1 row in set (0.00 sec)

mysql> explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 0, 1;
+-----------+---------+------+--------------------------------------------------+---------------+
| id | estRows | task | access object | operator info |
+-----------+---------+------+--------------------------------------------------+---------------+
| Point_Get | 1.00 | root | table:index_prune, clustered index:PRIMARY(a, b) | |
+-----------+---------+------+--------------------------------------------------+---------------+
1 row in set (0.00 sec)

mysql> explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 GROUP BY b;
+-----------+---------+------+--------------------------------------------------+---------------+
| id | estRows | task | access object | operator info |
+-----------+---------+------+--------------------------------------------------+---------------+
| Point_Get | 1.00 | root | table:index_prune, clustered index:PRIMARY(a, b) | |
+-----------+---------+------+--------------------------------------------------+---------------+
1 row in set (0.00 sec)

-- No SelectLock
mysql> explain format = 'brief' select * from t where a = 1 for update;
+-----------+---------+------+---------------+---------------+
| id | estRows | task | access object | operator info |
+-----------+---------+------+---------------+---------------+
| Point_Get | 1.00 | root | table:t | handle:1 |
+-----------+---------+------+---------------+---------------+
1 row in set (0.00 sec)

-- No Projection
mysql> explain format = 'brief' select * from t where _tidb_rowid = 0;
+-----------+---------+------+---------------+---------------+
| id | estRows | task | access object | operator info |
+-----------+---------+------+---------------+---------------+
| Point_Get | 1.00 | root | table:t | handle:0 |
+-----------+---------+------+---------------+---------------+
1 row in set (0.00 sec)

mysql> explain format = 'brief' select * from t where t._tidb_rowid = 1;
+-----------+---------+------+---------------+---------------+
| id | estRows | task | access object | operator info |
+-----------+---------+------+---------------+---------------+
| Point_Get | 1.00 | root | table:t | handle:1 |
+-----------+---------+------+---------------+---------------+
1 row in set (0.00 sec)

-- No Selection
mysql> explain format = 'brief' select * from t where (a, b, c) in ((1, 1, 1), (2, 2, 2));
+-----------------+---------+------+---------------------------------+------------------------------+
| id | estRows | task | access object | operator info |
+-----------------+---------+------+---------------------------------+------------------------------+
| Batch_Point_Get | 2.00 | root | table:t, index:idx_abc(a, b, c) | keep order:false, desc:false |
+-----------------+---------+------+---------------------------------+------------------------------+
1 row in set (0.01 sec)

-- Use Batch_Point_Get
mysql> explain format='brief' select * from t1 where id in (1, 1, 11);
+-----------------+---------+------+---------------------------+---------------------------------------------+
| id | estRows | task | access object | operator info |
+-----------------+---------+------+---------------------------+---------------------------------------------+
| Batch_Point_Get | 3.00 | root | table:t1, partition:p1,p2 | handle:[1 11], keep order:false, desc:false |
+-----------------+---------+------+---------------------------+---------------------------------------------+
1 row in set (0.00 sec)

mysql> explain format='brief' select * from t1 where id in (1, 11, 11, 21);
+-----------------+---------+------+------------------------------+------------------------------------------------+
| id | estRows | task | access object | operator info |
+-----------------+---------+------+------------------------------+------------------------------------------------+
| Batch_Point_Get | 4.00 | root | table:t1, partition:p0,p1,p2 | handle:[1 11 21], keep order:false, desc:false |
+-----------------+---------+------+------------------------------+------------------------------------------------+
1 row in set (0.00 sec)

mysql> explain format='brief' select * from t2 where id in (1, 1, 11);
+-----------------+---------+------+---------------------------+---------------------------------------------+
| id | estRows | task | access object | operator info |
+-----------------+---------+------+---------------------------+---------------------------------------------+
| Batch_Point_Get | 3.00 | root | table:t2, partition:p0,p1 | handle:[1 11], keep order:false, desc:false |
+-----------------+---------+------+---------------------------+---------------------------------------------+
1 row in set (0.00 sec)

mysql> explain format='brief' select * from t2 where id in (1, 1, 11);
+-----------------+---------+------+---------------------------+---------------------------------------------+
| id | estRows | task | access object | operator info |
+-----------------+---------+------+---------------------------+---------------------------------------------+
| Batch_Point_Get | 3.00 | root | table:t2, partition:p0,p1 | handle:[1 11], keep order:false, desc:false |
+-----------------+---------+------+---------------------------+---------------------------------------------+
1 row in set (0.00 sec)

mysql> explain select c from pt where c in (1,2,3);
+-------------------+---------+------+-------------------------+------------------------------+
| id | estRows | task | access object | operator info |
+-------------------+---------+------+-------------------------+------------------------------+
| Batch_Point_Get_1 | 3.00 | root | table:pt, index:uidx(c) | keep order:false, desc:false |
+-------------------+---------+------+-------------------------+------------------------------+
1 row in set (0.00 sec)

mysql> explain select * from pt where a in (1,2,3);
+-------------------+---------+------+------------------------+------------------------------+
| id | estRows | task | access object | operator info |
+-------------------+---------+------+------------------------+------------------------------+
| Batch_Point_Get_1 | 3.00 | root | table:pt, index:idx(a) | keep order:false, desc:false |
+-------------------+---------+------+------------------------+------------------------------+
1 row in set (0.00 sec)

-- Generate TableDual
mysql> explain format='brief' select * from t where pk = 256;
+-----------+---------+------+---------------+---------------+
| id | estRows | task | access object | operator info |
+-----------+---------+------+---------------+---------------+
| TableDual | 0.00 | root | | rows:0 |
+-----------+---------+------+---------------+---------------+
1 row in set (0.00 sec)

mysql> explain format='brief' select * from t where pk = 9223372036854775807;
+-----------+---------+------+---------------+---------------+
| id | estRows | task | access object | operator info |
+-----------+---------+------+---------------+---------------+
| TableDual | 0.00 | root | | rows:0 |
+-----------+---------+------+---------------+---------------+
1 row in set (0.00 sec)

mysql> explain format='brief' select * from t where pk = 9223372036854775808;
+-----------+---------+------+---------------+---------------+
| id | estRows | task | access object | operator info |
+-----------+---------+------+---------------+---------------+
| TableDual | 0.00 | root | | rows:0 |
+-----------+---------+------+---------------+---------------+
1 row in set (0.00 sec)

mysql> explain format='brief' select * from t where pk = 18446744073709551615;
+-----------+---------+------+---------------+---------------+
| id | estRows | task | access object | operator info |
+-----------+---------+------+---------------+---------------+
| TableDual | 0.00 | root | | rows:0 |
+-----------+---------+------+---------------+---------------+
1 row in set (0.00 sec)

-- Use plan cache
mysql> select @@last_plan_from_cache;
+------------------------+
| @@last_plan_from_cache |
+------------------------+
| 1 |
+------------------------+
1 row in set (0.00 sec)
```

### 3. What did you see instead (Required)

```
-- Redundant Limit/StreamAgg
mysql> explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 1;
+--------------------------+---------+-----------+-------------------+---------------------------------------------------------------------------------------------------------------+
| id | estRows | task | access object | operator info |
+--------------------------+---------+-----------+-------------------+---------------------------------------------------------------------------------------------------------------+
| Limit | 0.01 | root | | offset:0, count:1 |
| └─TableReader | 1.00 | root | | data:Limit |
| └─Limit | 1.00 | cop[tikv] | | offset:0, count:1 |
| └─TableRangeScan | 1.00 | cop[tikv] | table:index_prune | range:[1010010404050976781 26467085526790,1010010404050976781 26467085526790], keep order:false, stats:pseudo |
+--------------------------+---------+-----------+-------------------+---------------------------------------------------------------------------------------------------------------+
4 rows in set (0.00 sec)

mysql> explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 LIMIT 0, 1;
+--------------------------+---------+-----------+-------------------+---------------------------------------------------------------------------------------------------------------+
| id | estRows | task | access object | operator info |
+--------------------------+---------+-----------+-------------------+---------------------------------------------------------------------------------------------------------------+
| Limit | 0.01 | root | | offset:0, count:1 |
| └─TableReader | 1.00 | root | | data:Limit |
| └─Limit | 1.00 | cop[tikv] | | offset:0, count:1 |
| └─TableRangeScan | 1.00 | cop[tikv] | table:index_prune | range:[1010010404050976781 26467085526790,1010010404050976781 26467085526790], keep order:false, stats:pseudo |
+--------------------------+---------+-----------+-------------------+---------------------------------------------------------------------------------------------------------------+
4 rows in set (0.00 sec)

mysql> explain format = 'brief' select * from index_prune WHERE a = 1010010404050976781 AND b = 26467085526790 GROUP BY b;
+------------------------+---------+-----------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| id | estRows | task | access object | operator info |
+------------------------+---------+-----------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| StreamAgg | 1.00 | root | | group by:test.index_prune.b, funcs:firstrow(test.index_prune.a)->test.index_prune.a, funcs:firstrow(test.index_prune.b)->test.index_prune.b, funcs:firstrow(test.index_prune.c)->test.index_prune.c |
| └─TableReader | 1.00 | root | | data:TableRangeScan |
| └─TableRangeScan | 1.00 | cop[tikv] | table:index_prune | range:[1010010404050976781 26467085526790,1010010404050976781 26467085526790], keep order:true, stats:pseudo |
+------------------------+---------+-----------+-------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

-- Redundant SelectLock
mysql> explain format = 'brief' select * from t where a = 1 for update;
+------------------------+---------+-----------+---------------+---------------------------------------------+
| id | estRows | task | access object | operator info |
+------------------------+---------+-----------+---------------+---------------------------------------------+
| SelectLock | 1.00 | root | | for update 0 |
| └─TableReader | 1.00 | root | | data:TableRangeScan |
| └─TableRangeScan | 1.00 | cop[tikv] | table:t | range:[1,1], keep order:false, stats:pseudo |
+------------------------+---------+-----------+---------------+---------------------------------------------+
3 rows in set (0.00 sec)

-- Redundant Projection
mysql> explain format = 'brief' select * from t where _tidb_rowid = 0;
+------------------------+----------+-----------+---------------+---------------------------------------------+
| id | estRows | task | access object | operator info |
+------------------------+----------+-----------+---------------+---------------------------------------------+
| TableReader | 8000.00 | root | | data:Projection |
| └─Projection | 8000.00 | cop[tikv] | | test.t.a |
| └─TableRangeScan | 10000.00 | cop[tikv] | table:t | range:[0,0], keep order:false, stats:pseudo |
+------------------------+----------+-----------+---------------+---------------------------------------------+
3 rows in set (0.00 sec)

mysql> explain format = 'brief' select * from t where t._tidb_rowid = 1;
+------------------------+----------+-----------+---------------+---------------------------------------------+
| id | estRows | task | access object | operator info |
+------------------------+----------+-----------+---------------+---------------------------------------------+
| TableReader | 8000.00 | root | | data:Projection |
| └─Projection | 8000.00 | cop[tikv] | | test.t.a, test.t.b |
| └─TableRangeScan | 10000.00 | cop[tikv] | table:t | range:[1,1], keep order:false, stats:pseudo |
+------------------------+----------+-----------+---------------+---------------------------------------------+
3 rows in set (0.00 sec)

-- Redundant Selection
mysql> explain format = 'brief' select * from t where (a, b, c) in ((1, 1, 1), (2, 2, 2));
+------------------------+---------+-----------+---------------+------------------------------------------------------------------------------------------------------------------------------+
| id | estRows | task | access object | operator info |
+------------------------+---------+-----------+---------------+------------------------------------------------------------------------------------------------------------------------------+
| TableReader | 2.00 | root | | data:Selection |
| └─Selection | 2.00 | cop[tikv] | | or(and(eq(test.t.a, 1), and(eq(test.t.b, 1), eq(test.t.c, 1))), and(eq(test.t.a, 2), and(eq(test.t.b, 2), eq(test.t.c, 2)))) |
| └─TableRangeScan | 2.00 | cop[tikv] | table:t | range:[1,1], [2,2], keep order:false, stats:pseudo |
+------------------------+---------+-----------+---------------+------------------------------------------------------------------------------------------------------------------------------+
3 rows in set (0.00 sec)

-- Fail to use Batch_Point_Get
mysql> explain format='brief' select * from t1 where id in (1, 1, 11);
+----------------------+---------+-----------+-----------------+------------------------------------------------------+
| id | estRows | task | access object | operator info |
+----------------------+---------+-----------+-----------------+------------------------------------------------------+
| TableReader | 2.00 | root | partition:p1,p2 | data:TableRangeScan |
| └─TableRangeScan | 2.00 | cop[tikv] | table:t1 | range:[1,1], [11,11], keep order:false, stats:pseudo |
+----------------------+---------+-----------+-----------------+------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> explain format='brief' select * from t1 where id in (1, 11, 11, 21);
+----------------------+---------+-----------+--------------------+---------------------------------------------------------------+
| id | estRows | task | access object | operator info |
+----------------------+---------+-----------+--------------------+---------------------------------------------------------------+
| TableReader | 3.00 | root | partition:p0,p1,p2 | data:TableRangeScan |
| └─TableRangeScan | 3.00 | cop[tikv] | table:t1 | range:[1,1], [11,11], [21,21], keep order:false, stats:pseudo |
+----------------------+---------+-----------+--------------------+---------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> explain format='brief' select * from t2 where id in (1, 1, 11);
+----------------------+---------+-----------+-----------------+------------------------------------------------------+
| id | estRows | task | access object | operator info |
+----------------------+---------+-----------+-----------------+------------------------------------------------------+
| TableReader | 2.00 | root | partition:p0,p1 | data:TableRangeScan |
| └─TableRangeScan | 2.00 | cop[tikv] | table:t2 | range:[1,1], [11,11], keep order:false, stats:pseudo |
+----------------------+---------+-----------+-----------------+------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> explain format='brief' select * from t2 where id in (1, 1, 11);
+----------------------+---------+-----------+-----------------+------------------------------------------------------+
| id | estRows | task | access object | operator info |
+----------------------+---------+-----------+-----------------+------------------------------------------------------+
| TableReader | 2.00 | root | partition:p0,p1 | data:TableRangeScan |
| └─TableRangeScan | 2.00 | cop[tikv] | table:t2 | range:[1,1], [11,11], keep order:false, stats:pseudo |
+----------------------+---------+-----------+-----------------+------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> explain select c from pt where c in (1,2,3);
+------------------------+---------+-----------+-------------------------+---------------------------------------------+
| id | estRows | task | access object | operator info |
+------------------------+---------+-----------+-------------------------+---------------------------------------------+
| IndexReader_7 | 3.00 | root | partition:all | index:IndexRangeScan_5 |
| └─IndexRangeScan_5 | 3.00 | cop[tikv] | table:pt, index:uidx(c) | range:[1,1], [2,2], [3,3], keep order:false |
+------------------------+---------+-----------+-------------------------+---------------------------------------------+
2 rows in set (0.01 sec)

mysql> explain select * from pt where a in (1,2,3);
+-------------------------------+---------+-----------+------------------------+-------------------------------------------------------------------------+
| id | estRows | task | access object | operator info |
+-------------------------------+---------+-----------+------------------------+-------------------------------------------------------------------------+
| IndexLookUp_9 | 3.75 | root | partition:p0,p1 | |
| ├─Selection_8(Build) | 3.75 | cop[tikv] | | in(_tidb_tid, 235, 236) |
| │ └─IndexRangeScan_5 | 3.75 | cop[tikv] | table:pt, index:idx(a) | range:[1,1], [2,2], [3,3], keep order:false, stats:partial[idx:missing] |
| └─TableRowIDScan_6(Probe) | 3.75 | cop[tikv] | table:pt | keep order:false, stats:partial[idx:missing] |
+-------------------------------+---------+-----------+------------------------+-------------------------------------------------------------------------+
4 rows in set (0.00 sec)

-- Fail to generate TableDual
mysql> explain format='brief' select * from t where pk = 9223372036854775807;
+----------------------+---------+-----------+---------------+------------------------------------------------------------------+
| id | estRows | task | access object | operator info |
+----------------------+---------+-----------+---------------+------------------------------------------------------------------+
| TableReader | 3333.33 | root | | data:TableRangeScan |
| └─TableRangeScan | 3333.33 | cop[tikv] | table:t | range:[9223372036854775807,+inf], keep order:false, stats:pseudo |
+----------------------+---------+-----------+---------------+------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> explain format='brief' select * from t where pk = 128;
+----------------------+---------+-----------+---------------+-------------------------------------------------+
| id | estRows | task | access object | operator info |
+----------------------+---------+-----------+---------------+-------------------------------------------------+
| TableReader | 1.00 | root | | data:TableRangeScan |
| └─TableRangeScan | 1.00 | cop[tikv] | table:t | range:[128,128], keep order:false, stats:pseudo |
+----------------------+---------+-----------+---------------+-------------------------------------------------+
2 rows in set (0.00 sec)

mysql> explain format='brief' select * from t where pk = 256;
+----------------------+---------+-----------+---------------+-------------------------------------------------+
| id | estRows | task | access object | operator info |
+----------------------+---------+-----------+---------------+-------------------------------------------------+
| TableReader | 1.00 | root | | data:TableRangeScan |
| └─TableRangeScan | 1.00 | cop[tikv] | table:t | range:[256,256], keep order:false, stats:pseudo |
+----------------------+---------+-----------+---------------+-------------------------------------------------+
2 rows in set (0.00 sec)

mysql> explain format='brief' select * from t where pk = 9223372036854775807;
+----------------------+---------+-----------+---------------+---------------------------------------------------------------------------------+
| id | estRows | task | access object | operator info |
+----------------------+---------+-----------+---------------+---------------------------------------------------------------------------------+
| TableReader | 1.00 | root | | data:TableRangeScan |
| └─TableRangeScan | 1.00 | cop[tikv] | table:t | range:[9223372036854775807,9223372036854775807], keep order:false, stats:pseudo |
+----------------------+---------+-----------+---------------+---------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> explain format='brief' select * from t where pk = 9223372036854775808;
+----------------------+---------+-----------+---------------+---------------------------------------------------------------------------------+
| id | estRows | task | access object | operator info |
+----------------------+---------+-----------+---------------+---------------------------------------------------------------------------------+
| TableReader | 1.00 | root | | data:TableRangeScan |
| └─TableRangeScan | 1.00 | cop[tikv] | table:t | range:[9223372036854775808,9223372036854775808], keep order:false, stats:pseudo |
+----------------------+---------+-----------+---------------+---------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> explain format='brief' select * from t where pk = 18446744073709551615;
+----------------------+---------+-----------+---------------+-------------------------------------------------------------------+
| id | estRows | task | access object | operator info |
+----------------------+---------+-----------+---------------+-------------------------------------------------------------------+
| TableReader | 3333.33 | root | | data:TableRangeScan |
| └─TableRangeScan | 3333.33 | cop[tikv] | table:t | range:[18446744073709551615,+inf], keep order:false, stats:pseudo |
+----------------------+---------+-----------+---------------+-------------------------------------------------------------------+
2 rows in set (0.00 sec)

-- Fail to use plan cache
mysql> select @@last_plan_from_cache;
+------------------------+
| @@last_plan_from_cache |
+------------------------+
| 0 |
+------------------------+
1 row in set (0.00 sec)
```

### 4. What is your TiDB version? (Required)

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.