Teradata:如何扩展非空分区表的范围分区?

时间:2018-03-21 16:49:08

标签: teradata

我创建了一个表格mydb.mytable,基本上包含以下SQL,上周说

CREATE MULTISET TABLE mydb.mytable ,NO FALLBACK , NO BEFORE JOURNAL, NO AFTER JOURNAL, CHECKSUM = DEFAULT, DEFAULT MERGEBLOCKRATIO ( master_transaction_header VARCHAR(64) CHARACTER SET LATIN NOT CASESPECIFIC, demand_date DATE FORMAT 'YY/MM/DD', item_id BIGINT, QTY INTEGER, price DECIMAL(15,2)) PRIMARY INDEX ( master_transaction_header ) PARTITION BY RANGE_N(demand_date BETWEEN DATE '2018-01-01' AND CURRENT_DATE EACH INTERVAL '1' DAY );

当我尝试向其中插入数据时,例如昨天teradata会给我以下错误消息

Partitioning violation for table mydb.mytable

当我尝试使用:

扩展分区时

ALTER TABLE mydb.mytable MODIFY PRIMARY INDEX (master_transaction_header) ADD RANGE BETWEEN DATE '2018-03-15' AND CURRENT_DATE EACH INTERVAL '1' DAY;

我从teradata收到以下错误消息:

The altering of RANGE_N definition with CURRENT_DATE/CURRENT_TIMESTAMP is not allowed.

我明白我可以:

  1. 使用PARTITION BY RANGE_N(demand_date BETWEEN DATE '2018-01-01' AND '9999-12-31' EACH INTERVAL '1' DAY );
  2. 创建副本
  3. 将旧表格中的所有数据插入新表格
  4. 放下旧桌子
  5. 重命名新表
  6. 但我希望teradata为将分区添加到现有分区表提供更优雅的方式。

    我已经查阅了以下stackoverflow帖子:

    他们很有启发性,但我无法从其中的讨论中得出答案。

1 个答案:

答案 0 :(得分:2)

使用CURRENT_DATE进行分区是可能的,但我从来没有找到它的用例。

创建该表时,它将解析为当前日期,但之后未更改,请查看ResolvedCurrent_Date中的dbc.PartitioningConstraintsV列。当您提交ALTER TABLE mydb.mytable TO CURRENT时,它会再次解决并修改范围。

但是没有理由这样做,只需要定义足够大的范围,这样你就不必再修改它了,例如。

PARTITION BY RANGE_N(demand_date
                     BETWEEN DATE '2018-01-01'
                         AND DATE '2040-01-01' EACH INTERVAL '1' DAY);

未使用的分区在Teradata中的开销为零。