Разделить существующую таблицу по определенному идентификатору

У меня есть вопрос по Oracle SQL.

Мне нужно разделить существующую таблицу (заполненную данными) по определенному идентификатору. Я провел некоторое исследование, но я не понимаю, как это сделать. Когда я генерирую скрипт из уже созданной секционированной таблицы (в жабе), я получаю следующий вывод:

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
               )

Вы можете видеть, что для каждого идентификатора есть раздел, и это для 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).

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