【问题标题】:From Range Partition to Range-Interval从范围分区到范围间隔
【发布时间】:2013-09-17 07:50:18
【问题描述】:

我想从 Range Partition 移动到 Range-Interval,但我当前的表在 MAXVALUE 上有一个分区,并且用于分区的列允许空值:(

例如:假设我们有:

create table a (b number)
partition by range (b) (
  PARTITION p0 VALUES LESS THAN (10),
  PARTITION p1 VALUES LESS THAN (50),
  PARTITION p2 VALUES LESS THAN (MAXVALUE)
);

然后我们填充:

INSERT INTO a(b) VALUES (1);
INSERT INTO a(b) VALUES (11);
INSERT INTO a(b) VALUES (51);
INSERT INTO a(b) VALUES (null);

为了能够移动到区间,我们需要删除带有MAXVALUE的分区,因此,其他值应该移动到新的分区。
51不是问题,我会用VALUES LESS than 100创建分区,但是NULL呢?

我正在考虑更改为按范围分区(NVL(b,0)) 之类的东西,但我担心必须重新处理整个表(不可能,真实表有很多数据)。

有什么想法吗?

【问题讨论】:

    标签: oracle oracle11g data-partitioning


    【解决方案1】:

    You can't have NULL in the partition key column of an interval partitioned table(截至 12.1):

    间隔分区的限制

    • 您可以只指定一个分区键列,并且必须是 NUMBER、DATE、FLOAT 或 TIMESTAMP 数据类型。

    [...]

    • 您不能为分区键列指定 NULL 值。

    您也不能对分区键使用表达式。但是,正如@Shoelace 所建议的那样,您可以使用虚拟列(包含您的表达式)作为分区列:

    SQL> CREATE TABLE a (b NUMBER, comput_b NUMBER AS (NVL(b, 0)))
      2  PARTITION BY RANGE (comput_b) (
      3    PARTITION p0 VALUES LESS THAN (0),
      4    PARTITION p1 VALUES LESS THAN (50),
      5    PARTITION p2 VALUES LESS THAN (MAXVALUE)
      6  );
    
    Table created
    
    SQL> INSERT INTO a(b) VALUES (1);
    1 row inserted
    SQL> INSERT INTO a(b) VALUES (11);
    1 row inserted
    SQL> INSERT INTO a(b) VALUES (51);
    1 row inserted
    SQL> INSERT INTO a(b) VALUES (null);
    1 row inserted
    
    SQL> SELECT * FROM a;
    
             B   COMPUT_B
    ---------- ----------
             1          1
            11         11
                        0
            51         51
    

    在这种特殊情况下,我认为您需要重建表。

    【讨论】:

    • 这并不完全正确。从至少 11g 开始,您可以创建一个虚拟列(这只是一个表达式)并使用它来分区...
    • @ShoeLace 谢谢,我不知道!
    【解决方案2】:

    http://www.dba-oracle.com/t_interval_partitioning.htm 表示您可以使用alter table 语法将范围更改为间隔并再次返回

    alter table a set INTERVAL(100) ; 
    

    11g 的完整 alter table 语法可用here

    不幸的是,这似乎不允许您更改分区列..所以我认为您不走运。但你可以随时尝试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 2013-03-04
      相关资源
      最近更新 更多