Tuesday, February 10, 2015

ORA-29861: domain index is marked LOADING/FAILED/UNUSABLE

ORA-29861: domain index is marked LOADING/FAILED/UNUSABLE

Cause: 

An attempt has been made to access a domain index that is being built or is marked failed by an unsuccessful DDL or is marked unusable by a DDL operation.

Solution:

alter index indexname rebuild; 

Saturday, February 7, 2015

ORA-01450: maximum key length (3215) exceeded

SQL> ALTER INDEX TESTUSR.FBNK_ACCOUNT#HIS_207 REBUILD ONLINE PARALLEL 140 NOLOGGING;

                                                          *
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-01450: maximum key length (3215) exceeded

Cause of the Problem

Consider the total length of the index which cannot exceed a certain value.The  DB_BLOCK_SIZE value takes the responsibility.
If 2K block size then maximum index key length=758
If 4K block size then maximum index key length=1578
If 8K block size then maximum index key length=3218
If 16K block size then maximum index key length=6498

How the maximum index key length is measured 

Maximum index key length=Total index length (Sum of width of all indexed column+the number of indexed columns)
+ Length of the key(2 bytes)+ROWID(6 bytes)+the length of the rowid(1 byte)

The index key size is limited by the value of db_block_size, because a key value may not span multiple blocks. So, based on the size of the block size of index depends. In fact, it is required that any index block must contain at least TWO index entries per block.

So we can say that the maximum key length for an index will be less than half of
the DB_BLOCK_SIZE. But we know that in a block there also needed space for PCTFREE, INITRANS and space for block overhead(Block Header,ROW Directory, Table Directory, etc). After considering these bytes the actual space that can be used for the Index key is actually just over 1/3 of the DB_BLOCK_SIZE.

Solution of the Problem

The causes already indicates what might be the solutions. Solution may be,
1)Increase your database block size. Create a tablespace with bigger block size and create index on that tablespace.

2)If you have index on multiple columns then you can split index to single or 2 columns so that size does not extended over it can handle.

3)Rebuild the index without online clause. That is 
ALTER INDEX index_name REBUILD;