分区表查询分区选择partition不生效的bug

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

  • 【TiDB 版本】:docker镜像的latest版本
  • 【问题描述】:分区表查询指定分区和非分区字段的where条件之后,分区选择不生效。

以下SQL: SELECT * FROM r PARTITION(p1) WHERE filtered = 1;

其中r是分区表,查询的时候同时指定了分区和where条件,上面的查询会把其他分区下的"filtered = 1"的数据查出来,而其实p1分区下没有"filtered = 1"的数据。

若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出打印结果,请务必全选并复制粘贴上传。

您好,

  1. 麻烦看下 tidb 具体版本
  2. 可否提供相关的测试信息?建表语句,N 条数据,和你的执行结果。

explain analyze SELECT * FROM r PARTITION (p1) WHERE filtered = 1; 也可以提供下。

具体版本:5.7.25-TiDB-v3.0.12

不好意思,建表语句和数据不方便提供,explain信息如下:

这是其中一部分explain信息,其余的是一样的,都是扫描了各个分区。我这个表根据某一个字段hash分区,一共有128个分区。看explain信息的话,PARTITION完全没生效。

1赞

我在本地试了一下这种简单场景,没有复现

mysql> create table t (id int) partition by hash(id) partitions 128;
Query OK, 0 rows affected (0.05 sec)

mysql> explain SELECT * FROM t partition (p1) where id = 1;
+---------------------+----------+------+--------------------------------------------------------------------------+
| id                  | count    | task | operator info                                                            |
+---------------------+----------+------+--------------------------------------------------------------------------+
| TableReader_8       | 10.00    | root | data:Selection_7                                                         |
| └─Selection_7       | 10.00    | cop  | eq(test.t.id, 1)                                                         |
|   └─TableScan_6     | 10000.00 | cop  | table:t, partition:p1, range:[-inf,+inf], keep order:false, stats:pseudo |
+---------------------+----------+------+--------------------------------------------------------------------------+
3 rows in set (0.00 sec)

show create table rel_xhs_brand_note

可以把无关字段都去掉,然后表名列名替换一下了发出来不? @qihuajun

我的where条件用的字段不是分区字段,你再加一个字段然后where条件里用那个字段试一下,下面的语句就可以复现:

create table t (id int, name varchar(20)) partition by hash(id) partitions 128;

explain SELECT * FROM t partition (p1) where name = ‘1’;

我这边执行截图:

复现了吗?

谢谢,已复现,会尽快修复。

好的,谢谢!

提了一个 PR

master 分支上面表现是正常的

影响版本是 3.0.9 ~ 3.0.12

下个版本 3.0.13 里面应该会带进去

1赞

好的,谢谢

:+1: