【问题标题】:How to add Subpartition for existing table in Oracle如何在Oracle中为现有表添加子分区
【发布时间】:2018-04-04 16:50:37
【问题描述】:

我想在 SUBPARTITION TEMPLATE 中为现有的 INT_TMP 表添加“US”市场的子分区。所以子分区应该是:SUBPARTITION "SP_US" VALUES ( 'US' ) in SUBPARTITION TEMPLATE for exisitng INT_TMP table。

下面是我的创建表语句:

CREATE TABLE INT_TMP
   (LOAD_ID NUMBER 
, SYS_DB_NAME VARCHAR2(50 BYTE) 
, ENTITY_ID NUMBER 
, CHK_DATE DATE 
, VALUE NUMBER 
, NBR_CHECK VARCHAR2(50 BYTE) 
, SOURCE VARCHAR2(50 BYTE),
  MONTH_ID NUMBER
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS 
  STORAGE(
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "DATA_INT_TCA_EDW" 
  PARTITION BY LIST ("MONTH_ID") 
  SUBPARTITION BY LIST ("SYS_DB_NAME") 
  SUBPARTITION TEMPLATE ( 
    SUBPARTITION "SP_SO" VALUES ( 'SO' ), 
    SUBPARTITION "SP_UK" VALUES ( 'UK' ), 
    SUBPARTITION "SP_OTHERS" VALUES ( DEFAULT ) ) 
 ( 
 PARTITION P_201801  VALUES (201801) 
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
  STORAGE(
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE DATA_INT_TCA_EDW , 
 PARTITION P_201802  VALUES (201802) 
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
  STORAGE(
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE DATA_INT_TCA_EDW , 
 PARTITION P_201803  VALUES (201803) 
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
  STORAGE(
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE DATA_INT_TCA_EDW , 
 PARTITION P_201804  VALUES (201804) 
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
  STORAGE(
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE DATA_INT_TCA_EDW , 
 PARTITION P_201805  VALUES (201805) 
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
  STORAGE(
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE DATA_INT_TCA_EDW , 
 PARTITION P_201806  VALUES (201806) 
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
  STORAGE(
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE DATA_INT_TCA_EDW ) ;

【问题讨论】:

    标签: sql oracle alter-table partition


    【解决方案1】:

    如果您想更改子分区模板,您可以这样做:

    ALTER TABLE INT_TMP
    SET SUBPARTITION TEMPLATE ( 
        SUBPARTITION "SP_SO" VALUES ( 'SO' ), 
        SUBPARTITION "SP_UK" VALUES ( 'UK' ), 
        SUBPARTITION "SP_US" VALUES ( 'US' ),
        SUBPARTITION "SP_OTHERS" VALUES ( DEFAULT ) )
    /
    
    Table INT_TMP altered.
    

    但您可能想要(也)拆分现有的默认子分区:

    ALTER TABLE INT_TMP
    SPLIT SUBPARTITION "P_201801_SP_OTHERS"
    VALUES ('US') INTO (SUBPARTITION "P_201801_SP_US", SUBPARTITION "P_201801_SP_OTHERS")
    PARALLEL
    /
    
    Table INT_TMP altered.
    
    ALTER TABLE INT_TMP
    SPLIT SUBPARTITION "P_201802_SP_OTHERS"
    VALUES ('US') INTO (SUBPARTITION "P_201802_SP_US", SUBPARTITION "P_201802_SP_OTHERS")
    PARALLEL
    /
    
    Table INT_TMP altered.
    

    等等

    如果您不想全部重新输入,可以从数据字典中生成 split 语句:

    select 'ALTER TABLE INT_TMP SPLIT SUBPARTITION "' || subpartition_name || '"'
      || ' VALUES (''US'') INTO (SUBPARTITION "' || partition_name || '_SP_US",'
      || ' SUBPARTITION "' || subpartition_name || '");'
    from user_tab_subpartitions
    where subpartition_name = partition_name || '_SP_OTHERS';
    

    然后运行那些生成的语句。 (或者做同样的事情,但自动运行它们,在匿名块中使用动态 SQL...)

    【讨论】:

    • 如果我不想重新输入,如何从数据字典中生成拆分语句?
    • 在哪里可以找到子分区模板的值?自动生成子分区名称时,将模板从20个子分区修改为16个子分区的命令是什么。
    猜你喜欢
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 2021-08-15
    • 1970-01-01
    • 2019-08-13
    • 2020-07-03
    相关资源
    最近更新 更多