jueves, 26 de septiembre de 2013

ORA-01502

En este ejemplo, miro una razón por tener el error ORA-01502. Lo probé en Oracle 11.2.0.2.7. Creé una tabla en el tablespace SYSTEM por error: 

SQL> create table andrews_table
  2  tablespace system
  3  as select * from dba_tables
  4  /
 
Tabla creada.
 
SQL>

Creé un índice en la tabla y verifiqué que era válido:

SQL> create index andrews_index
  2  on andrews_table(table_name)
  3  /
 
Indice creado.
 
SQL> select status from user_indexes
  2  where index_name = 'ANDREWS_INDEX'
  3  /
 
STATUS
--------
VALID
 
SQL>

Le dije a Oracle de informarme sobre índices inutilizables:

SQL> alter session
  2  set skip_unusable_indexes = false
  3  /
 
Sesion modificada.
 
SQL>

Ejecuté una consulta para emplear el índice sin problemas: 

SQL> select count(*) from andrews_table
  2  where table_name = 'BLAH'
  3  /
 
  COUNT(*)
----------
         0
 
SQL>

Luego me di cuenta que la tabla estaba en el tablespace SYSTEM y la puse en el tablespace USERS, lo que invalidó el índice:

SQL> alter table andrews_table
  2  move tablespace users
  3  /
 
Tabla modificada.

SQL> select status from user_indexes
  2  where index_name = 'ANDREWS_INDEX'
  3  /
 
STATUS
--------
UNUSABLE
 
SQL>

Así cuando intenté a emplear el índice, tenía un error: 

SQL> select count(*) from andrews_table
  2  where table_name = 'BLAH'
  3  /
select count(*) from andrews_table
*
ERROR en linea 1:
ORA-01502: el indice 'OPS$ORACLE.ANDREWS_INDEX' o una
particion del mismo estan en estado inutilizable
 
SQL>

Después de reconstruir el índice, la consulta funcionó otra vez: 

SQL> alter index andrews_index rebuild
  2  /
 
Indice modificado.
 
SQL> select status from user_indexes
  2  where index_name = 'ANDREWS_INDEX'
  3  /
 
STATUS
--------
VALID
 
SQL> select count(*) from andrews_table
  2  where table_name = 'BLAH'
  3  /
 
  COUNT(*)
----------
         0
 

3 comentarios: