【问题标题】:Partition excisting table on a specific ID根据特定 ID 对现有表进行分区
【发布时间】:2015-02-20 13:17:51
【问题描述】:

我有一个 Oracle SQL 问题。

我需要在特定 ID 上对现有表(填充数据)进行分区。我做了一些研究,但我不知道如何。 当我从已创建的分区表(在 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(在此处添加答案以提高可读性):

感谢您的回答,温弗里德! 在我们说话的时候研究它。 但我也在寻找分区语句。因为它必须是一个列表,但在所有示例中,当他们进行列表分区时,他们会添加硬编码值。像这样:

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)。

编辑2: 我这样做了:

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 数据库不会在插入时自动创建分区?还是我错了?

【问题讨论】:

  • 在单个表上创建 100 多个分区是否有特定原因?它一定是一张非常大的桌子。
  • 这个数据库的目标公司需要它

标签: sql oracle plsql toad database-partitioning


【解决方案1】:

查看 Oracle PL/SQL Package DBMS_REDEFINITION,您可以在其中重新定义现有表,例如一个非分区表到一个分区表(即使没有应用程序停机时间)。

注意,您的表空间需要两倍的可用表大小,因为 DBMS_REDEFINITION 会创建“旧”表的副本,以防您必须进行回滚。

【讨论】:

  • 谢谢!在我们说话的时候研究它。但我也在寻找分区语句。因为它必须是一个列表,但在所有示例中,当他们进行列表分区时,他们会添加硬编码值。像这样: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)。
  • RANGE 分区呢?类似partition by range(ID) Interval (1)
  • 是的,这样做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:分区键映射到最大允许分区数之外的分区”所以我猜12C数据库不会在插入时自动创建分区?还是我错了?
  • 不,INTERVAL 分区的目的是自动创建它们。错误意思是:分区太多 - 这让我重复我之前的评论:“你为什么喜欢在一个表上创建这么多分区?”好像没什么用。
  • ID 的最少数量是多少。如果您输入 VALUES LESS THAN (1)INTERVAL (1) 并且最小值是 6226563032(如您的示例中所示),我假设 Oracle 尝试创建 6226563032(!!!) 分区。
猜你喜欢
  • 2015-08-10
  • 1970-01-01
  • 2014-06-07
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-19
相关资源
最近更新 更多