如何为分区LOB索引指定INITRANS?

时间:2014-07-24 22:34:23

标签: oracle indexing blob deadlock oracle11gr2

我有一个带有BLOB列的分区表。当多个用户从该表中删除每个事务多行时,我们经常遇到ORA-00060死锁,根据trc文件,死锁是由 LOB 索引分区中的ITL死锁引起的。所以我想重新创建具有比默认值2更高的LOB索引INITRANS的表。我可以对具有create table ... ( ... lob (...) store as ... ( ... index ... (... initrans 10 ... ) ) )的非分区表执行此操作,但对于分区表,Oracle表示 " ORA-22879:不能将LOB INDEX子句用于分区表"。有没有其他方法可以为分区LOB索引设置INITRANS?

(更新:请注意,我不需要更改现有的表格,我可以从头开始重新创建。这通常更容易。)

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) 

2 个答案:

答案 0 :(得分:2)

Oracle技术支持说我不能为分区LOB索引指定INITRANS。但是,他们也注意到使用SECUREFILE选项和DEDUPLICATE LOB选项(我们这样做)可能是导致问题的原因。所以我放弃了DEDUPLICATE LOB(只是为了确定,用KEEP_DUPLICATES替换它),现在LOB索引的死锁已经消失了! (我已经写了一些压力测试,你可以用DEDUPLICATE LOB在几分钟内导致几十个死锁错误,但KEEP_DUPLICATES没有错误。)

答案 1 :(得分:-1)

看起来错误背后的原因是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 ... ) ) )

我没有启用分区,因此无法尝试。