2010-01-28 29 views

Respuesta

20

Intentaré consolidar las respuestas dadas y convertirla en wiki de la comunidad.
Así índices se crean automáticamente por Oracle para estos casos:

  1. APC: Para clave principal y clave única a menos que ya existen tales índices.
  2. APC: Para el almacenamiento LOB y XMLType.
  3. Gary: Para mesa con una tabla anidada.
  4. Jim Hudson: Para materializado vista.
+0

El caso de "almacenamiento LOB" probablemente también resulte en índices para otros tipos de datos complejos. Aunque no he probado esto. Esperaría que los índices fueran creados por Oracle Spatial, Oracle Text, etc. –

+0

Es wiki de la comunidad. Si quiere agregar algo, simplemente puede editar esta respuesta. –

0

Sí, esa es la lista completa. Oracle crea automáticamente un índice para cada declaración UNIQUE o PRIMARY KEY.

+0

Según la [respuesta aceptada] (http://stackoverflow.com/a/2192193/521799) esa no es la lista completa ... –

18

En primer lugar, Oracle no siempre crea un índice cuando creamos una clave primaria o única. Si ya existe un índice en esa columna se utilizará en su lugar ...

SQL> create table t23 (id number not null) 
    2/

Table created. 

SQL> create index my_manual_idx on t23 (id) 
    2/

Index created. 

SQL> select index_name from user_indexes 
    2 where table_name = 'T23' 
    3/

INDEX_NAME 
------------------------------ 
MY_MANUAL_IDX 

SQL> 

... MY_MANUAL_IDX en cuenta que no es un índice único; no importa ...

SQL> alter table t23 
    2  add constraint t23_pk primary key (id) using index 
    3/

Table altered. 

SQL> select index_name from user_indexes 
    2 where table_name = 'T23' 
    3/

INDEX_NAME 
------------------------------ 
MY_MANUAL_IDX 

SQL> drop index my_manual_idx 
    2/
drop index my_manual_idx 
      * 
ERROR at line 1: 
ORA-02429: cannot drop index used for enforcement of unique/primary key 


SQL> 

Hay otro caso cuando Oracle creará automáticamente un índice: el almacenamiento de LOB ....

SQL> alter table t23 
    2  add txt clob 
    3  lob (txt) store as basicfile t23_txt (tablespace users) 
    4/

Table altered. 

SQL> select index_name from user_indexes 
    2 where table_name = 'T23' 
    3/

INDEX_NAME 
------------------------------ 
MY_MANUAL_IDX 
SYS_IL0000556081C00002$$ 

SQL> 

edición

La trata de bases de datos XMLType igual que otros LOB ...

SQL> alter table t23 
    2  add xmldoc xmltype 
    3/

Table altered. 

SQL> select index_name from user_indexes 
    2 where table_name = 'T23' 
    3/

INDEX_NAME 
------------------------------ 
MY_MANUAL_IDX 
SYS_IL0000556081C00002$$ 
SYS_IL0000556081C00004$$ 

SQL>  
+0

No he hecho Oracle por unos años, pero me parece recordar que Oracle podría utilizar un índice compuesto, si el campo se establece en único (o una clave principal?) fue el primer campo. Podría estar recordando mal, o podría haber cambiado desde la línea 8i, así que sugeriría probarlo si esto fuera útil. (para evitar tener un índice adicional y tomar el hit por escrito) – Joe

+0

Un ejemplo siempre es bueno para entender. – Guru

+0

@Joe - sí, tu recuerdo es correcto. – APC

3

No, estamos cada vez más cerca, pero esa no es una lista completa aún.

También se creará un índice automáticamente cuando cree una vista materializada ya que Oracle necesita poder identificar rápidamente las filas al realizar una actualización rápida. Para las vistas materializadas basadas en rowid, usa I_SNAP $ _tablename. Para clave primaria vistas materializadas, se utiliza el nombre de PK original, con las modificaciones necesarias para que sea único.

create materialized view testmv 
refresh force with rowid 
as select * from dual; 

select index_name from user_indexes where table_name = 'TESTMV'; 

Index Name 
-------------- 
I_SNAP$_TESTMV 
2

Y otro, si crea una tabla con una tabla anidada que presentamos lo mejor un índice creado automáticamente. El almacenamiento basado en objetos en general puede hacer esto ya que puede haber tablas ocultas creadas.

Creo que los XMLTypes basados ​​en esquema también lo harán.

Cuestiones relacionadas