“ORA-01502 인덱스 XX인덱스명 또는 XX 분할영역은 사용할 수 없는 상태입니다.”

1. Alter index {index_name} rebuild
2. Alter index {index_names} rebuild partition {partition_names}

만약 파티션 되지 않은 인덱스면 1번, 아니라면 “ORA-14806 : 분활영역된 인덱스는 전체를 다시 만들 수 없습니다”가 발생합니다. 그럴 경우 2번.

원인은 파티션은 파티션 별로 RowID를 다르게 갖게 됨으로 파티션의 변경이 발생하게 되면 RowID의 변경이 발생하게 됩니다. 그래서 실제 파티션 테이블의 RowID와 변경된 파티션 로컬 인덱스와 글로벌 인덱스의 RowID가 일치하지 않게 되어 인덱스 사용 중지 즉, IU 상태가 발생하게 되어 인덱스의 사용 불가 및 재 생성에 따른 운영 및 관리상의 부하 및 재 생성에 따른 시스템 부하가 발생하게 됩니다. 그런데 실제로, 운영권한으로

>>select *
>>from DBA_INDEXES
>>where index_name = 'XXX인덱스'

로 검색해본 결과 Stats 가 INDEX UNUSABLE 이 발생하는 ‘Unusable ‘ 상태가 아니었습니다. 한마디로 그 순간에 잠깐 ”ORA-01502”가 발생하는 상황이었다는 말이 됩니다.

해당 오류가 발생한 원인

1. 테이블은 파티셔닝이고, 인덱스가 non-파티셔닝으로 인해 발생하는 현상
2. 해당 파티션을 해당 인덱스를 통해서 엑세스 할 수 없게 됨으로 해당 어플리케이션의 수행을 유지 할 수 없는 상황에서 발생

2번의 경우 인덱스를 사용하지 않고 해당 파티션을 TABLE FULL SCAN 하면 에러가 발생하지 않지만 옵티마이져가 실행계획 수립시에는 INDEX UNUSABLE 상태 여부를 체크하지 않으므로 해당 인덱스를 사용하는 실행계획이 수립되고 실제 수행시 오류가 발생하게 됨으로 이미 운용중인 어플리케이션이나 SQL이 정상 수행되지 않습니다. 이런 경우에는 skip_unusable_indexes = TRUE 파라메터를 지정하면 수행시에 해당 인덱스가 UNUSABLE이면 이를 사용하지 않고 TABLE FULL SCAN 등을 한다. 경우에 따라서 유용하게 사용 가능하므로 고려 해 볼 수 있습니다.


참조