qihuajun
(Qihuajun)
1
为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
- 【TiDB 版本】:docker镜像的latest版本
- 【问题描述】:分区表查询指定分区和非分区字段的where条件之后,分区选择不生效。
以下SQL:
SELECT * FROM r PARTITION(p1) WHERE filtered = 1;
其中r是分区表,查询的时候同时指定了分区和where条件,上面的查询会把其他分区下的"filtered = 1"的数据查出来,而其实p1分区下没有"filtered = 1"的数据。
若提问为性能优化、故障排查类问题,请下载脚本运行。终端输出打印结果,请务必全选并复制粘贴上传。
来了老弟
2
您好,
- 麻烦看下 tidb 具体版本
- 可否提供相关的测试信息?建表语句,N 条数据,和你的执行结果。
explain analyze SELECT * FROM r PARTITION (p1) WHERE filtered = 1;
也可以提供下。
qihuajun
(Qihuajun)
3
具体版本: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
qihuajun
(Qihuajun)
5
我的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’;
我这边执行截图:
system
(system)
关闭
12
此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。