2015-02-20 3 views
0

У меня вопрос 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 (добавлен ответ здесь для удобства чтения):

Спасибо за ответ, 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"

Итак, я думаю, что базы данных 12С автоматически не создают разделы вставки? или я ошибаюсь?

+0

Есть ли особые причины для создания более 100 разделов на одной таблице? Это действительно огромная таблица. –

+0

Это необходимо для компании, что этот db предназначенный для – Deirfnrew

ответ

1

Посмотрите на пакет Oracle PL/SQL DBMS_REDEFINITION, там вы можете переопределить существующие таблицы, например. безразделенная таблица в секционированную таблицу (даже без простоя приложения).

Обратите внимание: вам нужно в два раза больше размера стола на вашем табличном пространстве, потому что DBMS_REDEFINITION создает копию вашей «старой» таблицы, если вам нужно выполнить откат.

+0

Thanks! Вглядываясь в него, когда мы говорим. Но я также ищу инструкцию раздела. Поскольку это должен быть список, но во всех примерах, когда они делают раздел списка, они добавляют жестко заданные значения. Как это: 'PARTITION BY LIST (LOC_CODE) ( ПЕРЕГОРОДОЧНЫЕ Grabb VALUES ('IND'), PARTITION CNILX VALUES ('NZ'), ПЕРЕГОРОДОЧНЫЕ NOAAS VALUES ('SL'), PARTITION SGIND VALUES (» RSA '), PARTATION SAARA VALUES (' PAK '), PARTATION MYABB VALUES (' USA ') ) ' Хотя он фактически должен быть динамическим (для каждого идентификатора). – Deirfnrew

+0

Как насчет разделов RANGE? Что-то вроде 'перегородки по диапазону (ID) Interval (1)' –

+0

Да сделал это, как этот 'перегородка диапазона (ID) интервала (1) (PARTITION "P0" ЗНАЧЕНИЯ МЕНЕЕ (1)) TABLESPACE«TABLESPAXE " ;' ; ';' ; ';';, но когда я хочу вставить некоторые данные. 'insert into partitioned_table select * from original_table где id = 123456;' Он выдает исключение: «ORA-14300: разбиение ключей на разделы вне максимально допустимого числа разделов " Итак, я думаю, что базы данных 12С автоматически не создают разделы вставки? или я ошибаюсь? – Deirfnrew