You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Teradata多级分区表含*的RANGE_N导致分区消除失效咨询

Teradata多级分区表分区消除失效问题分析

问题背景

在Teradata数据库中使用多级分区表时,遇到特定分区结构下分区消除未生效的性能问题,以下是具体复现实例及现象:


实例1:单分区表达式表(分区消除生效)

使用带*的RANGE_N按time_stamp分区,查询指定time_stamp范围时,计划成功仅扫描单个分区。

/* Table with single partitioning expression */
CREATE MULTISET TABLE table_single
     (
      id INTEGER,
      time_stamp INTEGER)
PRIMARY INDEX ( id ,time_stamp )
PARTITION BY RANGE_N(time_stamp  BETWEEN *,1651330800  AND 1656601199  EACH 3600 ,NO RANGE, UNKNOWN);

EXPLAIN SELECT count(*) FROM table_single WHERE time_stamp BETWEEN 1654041600 AND 1654041600 + 100;

执行计划结果片段

...
 3) We do an all-AMPs SUM step in TD_MAP1 to aggregate from 
    a single partition of table_single with a condition of
...

实例2:二级分区表(一级RANGE_N带*,分区消除失效)

新增按id的二级分区后,相同查询计划变为全表扫描,分区消除未生效。

/* Example with multi level partition */
CREATE MULTISET TABLE table_mult
     (
      id INTEGER,
      time_stamp INTEGER)
PRIMARY INDEX ( id ,time_stamp )
PARTITION BY (
  RANGE_N(time_stamp  BETWEEN *,1651330800  AND 1656601199  EACH 3600 ,NO RANGE, UNKNOWN),
  RANGE_N(id  BETWEEN 1  AND 200  EACH 1 ,NO RANGE, UNKNOWN)
);

EXPLAIN SELECT count(*) FROM table_mult WHERE time_stamp BETWEEN 1654041600 AND 1654041600 + 100;

执行计划结果片段

...
  3) We do an all-AMPs SUM step in TD_MAP1 to aggregate from
     table_mult by way of an all-rows scan with a condition of
...

实例3:二级分区表(移除一级RANGE_N的*,分区消除恢复)

移除一级RANGE_N中的*后,相同查询计划恢复分区消除,扫描指定分区。

/* Table with multilevel parition, v2 */
CREATE MULTISET TABLE table_mult2
     (
      id INTEGER,
      time_stamp INTEGER)
PRIMARY INDEX ( id ,time_stamp )
PARTITION BY (
  RANGE_N(time_stamp  BETWEEN 1651330800  AND 1656601199  EACH 3600 ,NO RANGE, UNKNOWN),
  RANGE_N(id  BETWEEN 1  AND 200  EACH 1 ,NO RANGE, UNKNOWN) 
);

EXPLAIN SELECT count(*) FROM table_mult2 WHERE time_stamp BETWEEN 1654041600 AND 1654041600 + 100;

执行计划结果片段

...
 3) We do an all-AMPs SUM step in TD_MAP1 to aggregate from 404
    partitions of table_mult2 with a condition of (
...

原因分析

  1. 单分区表的正常逻辑:单分区场景下,虽然RANGE_N包含*(匹配所有小于起始值的记录),但优化器可以直接推导查询的time_stamp范围落在1651330800~1656601199区间内的某个分区,直接排除*、NO RANGE、UNKNOWN分区,因此仅扫描目标分区。
  2. 二级分区带*的失效原因:Teradata优化器的分区消除逻辑对包含通配分区(*)的多级分区存在规则限制:当一级分区包含*前置分区时,优化器无法通过查询条件自动推导排除该通配分区(尽管从业务逻辑上可以明确排除),导致无法触发一级分区的消除,最终只能执行全表扫描。
  3. 移除*后的恢复逻辑:当一级分区的范围改为明确的闭区间后,优化器可以精准匹配查询条件对应的一级分区范围,再结合二级分区的结构,扫描所有匹配的一级分区下的二级分区,分区消除逻辑恢复正常。

内容的提问来源于stack exchange,提问作者Kota Mori

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 19:35:24