未来OB之神
#1
表T1是一个RANGE分区表 ,其DDL如下所示:CREATE TABLE t1(C1 INT, C2 INT) PARTITION BY RANGE(C1+1) (PARTITION P0 VALUES LESS THAN(100) PARTITION P1 VALUES LESS THAN(200) PARTITION P2 VALUES LESS THAN(MAXVALUE)); 则以下SQL语句查询T1时需要访问的分区情况是:SELECT * FROM T1 WHERE C1>=199;
A. 需访问分区P1和P2
B. 仅访问分区P1
C. 仅访问分区P2
D. 需访问全部分区
可可可
#3
正确答案是 D. 需访问全部分区 。
解析:
在 OceanBase 等分布式数据库中,进行分区裁剪(Partition Pruning)的前提是查询条件中必须包含分区键 本身。
在题目给定的 DDL 中,表 T1 的分区键是表达式 (C1+1) ,而不是单纯的列 C1 。
查询语句 SELECT * FROM T1 WHERE C1>=199; 的过滤条件仅使用了 C1 ,并没有直接使用分区键 (C1+1) 。由于数据库优化器无法直接将 C1>=199 转换为对表达式 (C1+1) 的等价范围计算来进行精确的分区裁剪,因此无法排除任何分区,最终会导致全分区扫描 。
1 个赞