Как указать INITRANS для секционированного индекса LOB?

У меня есть секционированная таблица со столбцом BLOB. Когда несколько строк за транзакцию удаляются из этой таблицы несколькими пользователями, мы часто сталкиваемся с взаимоблокировками ORA-00060, которые, согласно файлам trc, вызваны взаимоблокировками ITL в разделах индекса LOB. Поэтому я хочу воссоздать таблицу с более высоким индексом LOB INITRANS, чем значение по умолчанию 2. Я могу сделать это для неразделенной таблицы с create table ... ( ... lob (...) store as ... ( ... index ... (... initrans 10 ... ) ) ), но для многораздельной таблицы Oracle говорит: «ORA-22879: нельзя использовать предложение LOB INDEX для секционированных столы». Есть ли другой способ установить INITRANS для секционированного индекса LOB?

(Обновление: обратите внимание, что мне не нужно ИЗМЕНЯТЬ существующую таблицу, я могу воссоздать ее с нуля. Обычно это проще.)

Редактирование jonearles следует ниже:

Вот пример того, как обычный метод не работает:

create table test1(a number, b clob)
partition by range (a) (partition p1 values less than (1));

select * from dba_indexes where owner = user and table_name = 'TEST1';

--ORA-22864: cannot ALTER or DROP LOB indexes
alter index SYS_IL0000111806C00002$$ initrans 3;

Интересно отметить, что индексный DDL выглядит очень странно. Приведенный ниже код не запустится — в индексе нет выражения, а круглая скобка даже не закрыта.

select dbms_metadata.get_ddl('INDEX', 'SYS_IL0000111806C00002$$') from dual;

  CREATE UNIQUE INDEX "JHELLER"."SYS_IL0000111806C00002$$" ON "JHELLER"."TEST1" (
  PCTFREE 10 INITRANS 1 MAXTRANS 255 
  STORAGE(
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) LOCAL
 (PARTITION "SYS_IL_P19289" 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 LOGGING 
  STORAGE( INITIAL 65536 NEXT 1048576 MAXEXTENTS 2147483645
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" , 
 PARTITION "SYS_IL_P19290" 
  PCTFREE 10 INITRANS 2 MAXTRANS 255 LOGGING 
  STORAGE( INITIAL 65536 NEXT 1048576 MAXEXTENTS 2147483645
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ) 
  PARALLEL (DEGREE 0 INSTANCES 0) 

person ddekany    schedule 24.07.2014    source источник
comment
Может получить лучший ответ на dba.stackexchange.com   -  person Dave Costa    schedule 31.07.2014


Ответы (2)


Служба технической поддержки Oracle сообщила, что я не могу указать INITRANS для секционированного индекса LOB. Однако они также заметили, что использование опции SECUREFILE вместе с опцией DEDUPLICATE LOB (что мы и сделали) может быть причиной проблемы. Итак, я отказался от DEDUPLICATE LOB (на всякий случай заменил его на KEEP_DUPLICATES), и теперь взаимоблокировки LOB-индекса ушли! (Я написал небольшой стресс-тест, и с его помощью вы можете вызвать десятки ошибок взаимоблокировки за несколько минут с DEDUPLICATE LOB, но ни одной с KEEP_DUPLICATES.)

person ddekany    schedule 05.01.2015

Похоже, причина ошибки в том, что LOB также разделен на разделы, поэтому вам нужно будет изменить каждый раздел отдельно. Я нашел заметку от Oracle о том, что способ перемещения LOB-раздела:

alter table <table name> move partition <table partition name>
lob (<lob column name>) store as (tablespace <lob tablespace name>)

Поэтому мне интересно, можете ли вы также использовать это для изменения параметров хранения, например:

alter table <table name> move partition <table partition name>
lob (<lob column name>) store as (... index ... (... initrans 10 ... ) ) )

У меня не включено разбиение, поэтому не могу попробовать.

person Dave Costa    schedule 31.07.2014
comment
Я попробую это, когда вернусь к работе (на следующей неделе). Однако эта таблица также разделена по интервалам, поэтому новые разделы создаются Oracle автоматически. - person ddekany; 01.08.2014
comment
Такой метод здесь обычно не работает, см. пример, добавленный к вопросу. - person Jon Heller; 04.08.2014
comment
@jonearles Извините, но я не вижу связи между примером, который вы добавили к вопросу (в котором используется ALTER INDEX), и предложением в моем ответе. Возможно, вы правы в том, что это не сработает; У меня нет возможности проверить это; но ваш пример не показывает этого, насколько я могу судить. - person Dave Costa; 07.08.2014