【问题标题】:Teradata: How to extend the range partition of a non-empty partitioned table?Teradata:如何扩展非空分区表的范围分区?
【发布时间】:2018-08-30 22:02:01
【问题描述】:

我创建了一个表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. 重命名新表

但我希望 teradata 提供一种更优雅的方式来将分区添加到现有分区表

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

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

【问题讨论】:

    标签: teradata


    【解决方案1】:

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

    当您创建该表时,它会被解析为当前日期,但之后不会更改,请检查dbc.PartitioningConstraintsV 中的ResolvedCurrent_Date 列。当您提交 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 中的开销为零。

    【讨论】:

    • 非常感谢。 ALTER TABLE mydb.mytable TO CURRENT 正是我想要的。我明白你关于创建足够远的未来分区的观点,但我更喜欢CURRENT_DATE 提供的优雅。感谢您为我提供支持。
    • 如果您不每天更新 ETL 的分区定义,则问题在于明天没有空分区,也没有 NO RANGE 分区。虽然很优雅,但我宁愿避免每天修改生产表的定义以进行分区维护。
    • @RobPaller 是绝对正确的,但我不会称之为优雅,它容易出错(更糟糕的是,当您添加 NO RANGE 并忘记扩展时)。此语法用于滚动范围,即开始和结束的 CURRENT_DATE。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    相关资源
    最近更新 更多