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

