在特定ID上对现有表进行分区

时间:2015-02-20 13:17:52

标签: sql oracle plsql toad database-partitioning

我有一个Oracle SQL问题。

我需要在特定ID上对现有表(填充数据)进行分区。我做了一些研究,但我不知道如何。 当我从已经创建的分区表(In toad)生成脚本时,我得到了这个输出:

PARTITION BY LIST (ID)
(  
  PARTITION SAMPLE_TABLE_6226563032 VALUES (6226563032)
    LOGGING
    NOCOMPRESS 
    TABLESPACE samplespace
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                NEXT             1M
                MAXSIZE          UNLIMITED
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                BUFFER_POOL      DEFAULT
                FLASH_CACHE      DEFAULT
                CELL_FLASH_CACHE DEFAULT
               ),  
  PARTITION SAMPLE_TABLE_6164428638 VALUES (6164428638)
    LOGGING
    NOCOMPRESS 
    TABLESPACE samplespace
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                NEXT             1M
                MAXSIZE          UNLIMITED
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                BUFFER_POOL      DEFAULT
                FLASH_CACHE      DEFAULT
                CELL_FLASH_CACHE DEFAULT
               ),  
  PARTITION SAMPLE_TABLE_6164428803 VALUES (6164428803)
    LOGGING
    NOCOMPRESS 
    TABLESPACE samplespace
    PCTFREE    10
    INITRANS   1
    MAXTRANS   255
    STORAGE    (
                INITIAL          64K
                NEXT             1M
                MAXSIZE          UNLIMITED
                MINEXTENTS       1
                MAXEXTENTS       UNLIMITED
                BUFFER_POOL      DEFAULT
                FLASH_CACHE      DEFAULT
                CELL_FLASH_CACHE DEFAULT
               )

您可以看到每个ID都有一个分区,这个分区有100多个IDS /记录。

有人知道解决方案吗?

提前致谢。

EDIT1(为了便于阅读,在此添加了答案):

谢谢你的回答,Wernfried! 在我们说话时调查它。 但我也在搜索分区语句。因为它必须是一个列表,但在所有示例中,当它们执行列表分区时,它们会添加硬编码值。像这样:

PARTITION BY LIST (LOC_CODE) ( PARTITION GRABB VALUES ('IND'), PARTITION CNILX VALUES ('NZ'), PARTITION NOAAS VALUES ('SL'), PARTITION SGIND VALUES ('RSA'), PARTITION SAARA VALUES ('PAK'), PARTITION MYABB VALUES ('USA') )

虽然它实际上必须是动态的(对于每个ID)。

EDIT2: 我这样做了:

partition by range (id) interval (1) (PARTITION "P0" VALUES LESS THAN (1)) TABLESPACE "TABLESPAXE" ;

但是当我想插入一些数据时

insert into partitioned_table select * from original_table where id=123456 ;

它抛出异常:

"ORA-14300: partitioning key maps to a partition outside maximum permitted number of partitions"

所以我猜12C数据库不会在插入时自动创建分区?或者我错了?

1 个答案:

答案 0 :(得分:1)

查看Oracle PL / SQL包DBMS_REDEFINITION,您可以在那里重新定义现有的表,例如:分区表的非分区表(即使没有应用程序停机时间)。

请注意,您的桌面空间需要两倍的桌面空间,因为DBMS_REDEFINITION会创建一个旧版本的#34;表,以防您必须进行回滚。