2014-07-24 3 views
5

BLOB 열이있는 분할 된 테이블이 있습니다. 트랜잭션 당 여러 행이 여러 사용자에 의해이 테이블에서 삭제되면 trc 파일에 따라 LOB 인덱스 파티션의 ITL 교착 상태 때문에 교착 상태가 발생하는 ORA-00060 교착 상태가 발생합니다. 따라서 기본 LOB 인덱스 INITRANS가 높은 테이블을 다시 만들고 싶습니다. create table ... (... lob (...) store as ... (... index ... (... initrans 10 ...)))으로 파티션되지 않은 테이블에 대해 수행 할 수 있지만, 분할 된 테이블에 대해서는 Oracle이 말합니다. "ORA-22879 : LOB INDEX 절을 사용할 수 없습니다. 파티션 된 테이블 "을 참조하십시오. 파티션 된 LOB 인덱스에 대해 INITRANS를 설정할 수있는 다른 방법이 있습니까?파티션 된 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) 
+0

http://dba.stackexchange.com/ –

답변

-1

오류 뒤에있는 이유는 LOB도 분할되어 있으므로 각 분할 영역을 개별적으로 변경해야한다는 것입니다. 나는 그들이 방식으로 이동하는 것을 Oracle에서 메모를 발견 LOB 파티션은 다음과 같습니다

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

내가 돈 ': 그래서 당신은 또한 스토리지 매개 변수, 예를 변경하려면이 옵션을 사용할 수 있는지 궁금

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

분할 기능이 활성화되어 있으므로 시도 할 수 없습니다.

+0

에서 더 나은 응답을 얻을 수 있습니다. 내가 일하러 돌아올 때 이것을 시도 할 것입니다 (다음 주). 그러나이 테이블은 또한 "간격 파티션"이므로 새로운 파티션은 Oracle에 의해 자동으로 작성됩니다. – ddekany

+0

이와 같은 방법은 일반적으로 여기서는 작동하지 않습니다. 질문에 추가 된 예를 참조하십시오. –

+0

@jonearles 죄송하지만, 질문에 추가 한 예제 (ALTER INDEX를 사용하는)와 내 답변의 제안 사이에 연결이 표시되지 않습니다. 당신은 그것이 효과가 없을 것이라고 옳을지도 모른다. 나는 그것을 시험 할 방법이 없다. 그러나 당신의 본보기는 제가 말할 수있는 한 그것을 보여주지 못합니다. –

2

오라클 기술 지원부에서는 파티션 된 LOB 색인에 INITRANS를 지정할 수 없다고했습니다. 그러나 그들은 또한 SECUREFILE 옵션과 함께 DEDUPLICATE LOB 옵션 (우리가 수행 한)을 함께 사용하면 문제가 발생할 수 있음을 알았습니다. 그래서 DEDUPLICATE LOB을 포기하고 (확실하게 바꾸려면 KEEP_DUPLICATES으로 바꾼 것) 이제 LOB 인덱스 교착 상태가 사라졌습니다! (약간의 스트레스 테스트를 작성 했으므로 DEDUPLICATE LOB을 사용하면 몇 분 안에 여러 개의 고정 된 잠금 오류가 발생할 수 있지만 KEEP_DUPLICATES은없는 것입니다.