OceanBase MySQL 模式下,分区表查询一定会发生分区裁剪吗?

最近在学习 OceanBase 的分区表,发现一个问题不是特别理解。

假设有一张 Range 分区表:

CREATE TABLE orders (
    id BIGINT NOT NULL,
    user_id BIGINT,
    create_time DATETIME,
    amount DECIMAL(10,2),
    PRIMARY KEY (id, create_time)
)
PARTITION BY RANGE COLUMNS(create_time) (
    PARTITION p202601 VALUES LESS THAN ('2026-02-01'),
    PARTITION p202602 VALUES LESS THAN ('2026-03-01'),
    PARTITION p202603 VALUES LESS THAN ('2026-04-01'),
    PARTITION pmax VALUES LESS THAN (MAXVALUE)
);

如果执行:

SELECT *
FROM orders
WHERE create_time >= '2026-03-01'
  AND create_time < '2026-04-01';

理论上应该可以通过分区裁剪,只访问 p202603

但是如果 SQL 改成:

SELECT *
FROM orders
WHERE DATE(create_time) = '2026-03-15';

这种情况下 OceanBase 还能正常进行分区裁剪吗?

不能正常进行分区裁剪,where 谓词使用了函数,凡把分区键包进函数的写法都会破坏裁剪,该条件会退化为逐行 filter。
如果去掉函数,是可以裁剪的。WHERE create_time = ‘2026-03-15’;

快速判断查询命中分区的方法:
explain sql语句

看 partitions 关键字有分区裁剪范围。