代码之家  ›  专栏  ›  技术社区  ›  tipanverella

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

  •  0
  • tipanverella  · 技术社区  · 7 年前

    我已经创建了一个表, 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;

    我从收到以下错误消息 天睿资讯 :

    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帖子:

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

    1 回复  |  直到 7 年前
        1
  •  3
  •   dnoeth    7 年前

    使用CURRENT\u 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中没有开销。