1

Допуская следующую таблицу:ORACLE - Разметка с изменением значений

create table INVOICE(         
INVOICE_ID NUMBER       
,INVOICE_SK NUMBER 
,INVOICE_AMOUNT NUMBER 
,INVOICE_TEXT VARCHAR2(4000 Char) 
,B2B_FLAG NUMBER -- 0 or 1      
,ACTIVE NUMBER(1) -- 0 or 1        
) 
PARTITION BY LIST (ACTIVE) 
SUBPARTITION BY LIST (B2B_FLAG) 
(PARTITION p_active_1 values (1) 
    (SUBPARTITION sp_b2b_flag_11 VALUES (1) 
    , SUBPARTITION sp_b2b_flag_10 VALUES (0) 
) 
, 
PARTITION p_active_0 values (0) 
    (SUBPARTITION sp_b2b_flag_01 VALUES (1) 
    , SUBPARTITION sp_b2b_flag_00 VALUES (0) 
) 
) 

Для Perfomance причинам таблица должна получить "Composite List-List" секционирования см http://docs.oracle.com/cd/E18283_01/server.112/e16541/part_admin001.htm#i1006565.

Проблемным моментом является то, что ACTIVE-Flag будет изменяться для огромного количества записей, а иногда и для B2B_FLAG. Будет ли Oracle автоматически распознавать записи, для которых значение секционирования было изменено, и переместить их в соответствующий раздел или мне нужно вызвать какую-то функцию обслуживания, чтобы реорганизовать разделы?

ответ

2

Вам необходимо включить перемещение строки в таблице, или инструкция обновления завершится с ORA-14402: updating partition key column would cause a partition change.

Смотрите следующий TestCase:

create table T_TESTPART 
(
    pk  number(10), 
    part_key number(10) 
) 
partition by list (part_key) (
partition p01 values (1), 
partition p02 values (2), 
partition pdef values (default) 
); 
alter table T_TESTPART 
    add constraint pk_pk primary key (PK); 

Теперь вставить строку и попытаться обновить значение разделов:

insert into t_testpart values (1,1); 
update t_testpart set part_key = 2 where pk = 1; 

Вы теперь получить упомянутое выше ошибки. Если включить движение строки, то же самое утверждение будет работать, и оракул переместит строку в другой раздел:

alter table t_testpart enable row movement; 
update t_testpart set part_key = 2 where pk = 1; 

я не делал каких-либо тестов производительности, но Oracle, вероятно, удалить строку из первого раздела и вставьте его во второй раздел. Подумайте об этом при использовании в больших масштабах. В моих собственных базах данных я обычно использую только разбиение на столбцы, которые не меняются.

Дальнейшее чтение: http://www.dba-oracle.com/t_callan_oracle_row_movement.htm

+0

Большое спасибо! – royskatt