多选题 以下哪些场景会直接导致分区裁剪失效,引发全分区扫描?()

多选题
以下哪些场景会直接导致分区裁剪失效,引发全分区扫描?()

A. 分区键字段使用函数加工:where date_format(ctime,’%Y-%m’)=‘2026-06’
B. 查询条件分区字段与常量发生隐式类型转换
C. SQL查询where条件直接携带分区键等值查询
D. 使用or拼接不同分区范围,跨多分区无统一过滤条件

1 个赞

正确答案:A、B、D

分区裁剪(Partition Pruning)是 OceanBase 查询优化的重要手段,优化器会根据 WHERE 条件中的分区键信息,只扫描符合条件的分区,避免全分区扫描。以下逐一分析:

  • A. 分区键字段使用函数加工:where date_format(ctime,'%Y-%m')='2026-06'
    对分区键使用函数(如 date_formatto_charupper 等)后,优化器无法直接提取分区键的原始值来定位分区,导致分区裁剪失效,引发全分区扫描。正确写法应为 where ctime >= '2026-06-01' and ctime < '2026-07-01'
  • B. 查询条件分区字段与常量发生隐式类型转换
    当分区键字段与常量之间存在隐式类型转换(如分区键是字符串类型,查询条件传入数字;或分区键是数值类型,条件传入字符串),优化器可能无法准确判断分区边界,导致裁剪失效。应确保查询条件与分区键类型严格一致。
  • C. SQL 查询 WHERE 条件直接携带分区键等值查询
    这恰恰是分区裁剪生效的典型场景。例如 where partition_key = 100,优化器可以直接定位到对应的分区,只扫描该分区,不会引发全分区扫描。
  • D. 使用 OR 拼接不同分区范围,跨多分区无统一过滤条件
    当使用 OR 连接多个分区范围条件时(如 where partition_key = 1 OR partition_key = 2 OR ... 跨大量分区),优化器可能无法有效裁剪,退化为扫描所有涉及的分区。尤其当 OR 条件复杂、跨分区过多且无统一过滤下推时,容易导致全分区扫描。