ob v4.4分区裁剪问题

【 使用环境 】 测试环境
【 OB or 其他组件 】 oceanbase v4.4
【 使用版本 】
Server version: 5.6.25 OceanBase 4.4.0.0 (r100000562025070723-014a767e54eac8efc0e4a5c8bbc34126e41892dd) (Built Jul 7 2025 23:15:18)

【问题描述】查询分区表,查询语句1访问全部分区,查询语句2访问P2分区,理论上来说,不应该2个语句全部访问P2分区么?

表创建语句如下
CREATE TABLE test1(
id INT,
name INT)
PARTITION BY RANGE(id + 1)(
PARTITION PO VALUES LESS THAN(1000),
PARTITION P1 VALUES LESS THAN(2000),
PARTITION P2 VALUES LESS THAN(MAXVALUE));

查询语句1:

MySQL [test]> explain SELECT * FROM test1 WHERE id>= 2000;
±-----------------------------------------------------------------------------------+
| Query Plan |
±-----------------------------------------------------------------------------------+
| ============================================================= |
| |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| |
| ------------------------------------------------------------- |
| |0 |PX COORDINATOR | |1 |7 | |
| |1 |└─EXCHANGE OUT DISTR |:EX10000|1 |7 | |
| |2 | └─PX PARTITION ITERATOR| |1 |7 | |
| |3 | └─TABLE FULL SCAN |test1 |1 |7 | |
| ============================================================= |

Outputs & filters:
0 - output([INTERNAL_FUNCTION(test1.id, test1.name)]), filter(nil), rowset=16
1 - output([INTERNAL_FUNCTION(test1.id, test1.name)]), filter(nil), rowset=16
dop=1
2 - output([test1.id], [test1.name]), filter(nil), rowset=16
force partition granule
3 - output([test1.id], [test1.name]), filter([test1.id >= 2000]), rowset=16
access([test1.id], [test1.name]), partitions(p[0-2])
is_index_back=false, is_global_index=false, filter_before_indexback[false],
range_key([test1.__pk_increment]), range(MIN ; MAX)always true

±-----------------------------------------------------------------------------------+
19 rows in set (0.070 sec)

查询语句2:
MySQL [test]> explain SELECT * FROM test1 WHERE id =2000;
±-----------------------------------------------------------------------------------+
| Query Plan |
±-----------------------------------------------------------------------------------+
| ================================================ |
| |ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)| |
| ------------------------------------------------ |
| |0 |TABLE FULL SCAN|test1|1 |3 | |
| ================================================ |

Outputs & filters:
0 - output([test1.id], [test1.name]), filter([test1.id = 2000]), rowset=16
access([test1.id], [test1.name]), partitions(p2)
is_index_back=false, is_global_index=false, filter_before_indexback[false],
range_key([test1.__pk_increment]), range(MIN ; MAX)always true

±-----------------------------------------------------------------------------------+
11 rows in set (0.003 sec)

2 个赞

感谢分享

1 个赞

1 个赞

对分区这块掌握的还不好,好好学习下