Разделяне на съществуваща таблица на конкретен идентификатор

Имам въпрос за Oracle SQL.

Трябва да разделя съществуваща таблица (пълна с данни) по конкретен идентификатор. Направих някои изследвания, но не виждам как. Когато генерирам скрипт от вече направена разделена таблица (в 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 не създават автоматично дялове при вмъкване? или греша?


person Deirfnrew    schedule 20.02.2015    source източник
comment
Има ли конкретна причина да създавате 100+ дяла на една маса? Трябва да е наистина огромна маса.   -  person Wernfried Domscheit    schedule 20.02.2015
comment
Това е необходимо за компанията, за която е предназначена тази база данни   -  person Deirfnrew    schedule 24.02.2015


Отговори (1)


Разгледайте пакета Oracle PL/SQL DBMS_REDEFINITION, там можете да предефинирате съществуващи таблици, напр. неразделена таблица към разделена таблица (дори без прекъсване на приложението).

Забележете, имате нужда от два пъти по-голям размер на таблицата, свободен във вашето таблично пространство, защото DBMS_REDEFINITION създава копие на вашата "стара" таблица, в случай че трябва да направите връщане назад.

person Wernfried Domscheit    schedule 20.02.2015
comment
Благодаря! Разглеждайки го, докато говорим. Но аз също търся оператора за разделяне. Тъй като трябва да е списък, но във всички примери, когато правят разделяне на списък, те добавят твърдо кодирани стойности. Подобно на това: 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). - person Deirfnrew; 20.02.2015
comment
Какво ще кажете за RANGE дялове? Нещо като partition by range(ID) Interval (1) - person Wernfried Domscheit; 20.02.2015
comment
Да, направих го така 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 не създават автоматично дялове при вмъкване? или греша? - person Deirfnrew; 24.02.2015
comment
Не, целта на INTERVAL дяловете е те да се създават автоматично. Грешката означава: Твърде много дялове - което ми позволява да повторя предишния си коментар: Защо искате да създавате толкова много дялове на една маса? Изглежда, че е безполезно. - person Wernfried Domscheit; 24.02.2015
comment
Кое е вашето най-малко число от ID. Ако поставите VALUES LESS THAN (1) и INTERVAL (1) и най-малката стойност е 6226563032 (както във вашия пример), предполагам, че Oracle се опитва да създаде 6226563032(!!!) дяла. - person Wernfried Domscheit; 24.02.2015
comment
да, току-що разбрах и аз. Не ми трябват толкова много повече, просто имах нужда от дял за id=6226563032 и един за id=789421236 (чист произволен). Но сега виждам, че той създава целия интервал, така че не е това, от което имах нужда - person Deirfnrew; 24.02.2015