2010-01-28 8 views

Antwort

20

Ich werde versuchen, gegebene Antworten zu konsolidieren und es Community-Wiki zu machen.
So Indizes werden von Oracle automatisch für solche Fälle geschaffen:

  1. APC: Für Primärschlüssel und eindeutige Schlüssel, sofern eine solche Indizes bereits vorhanden sind.
  2. APC: Für LOB-Speicher und XMLType.
  3. Gary: Für Tabelle mit einer geschachtelten Tabelle.
  4. Jim Hudson: Für materialisierte Ansicht.
+0

Der Fall "LOB-Speicher" führt wahrscheinlich auch zu Indizes für andere komplexe Datentypen. Obwohl ich das nicht getestet habe. Ich würde erwarten, dass Indizes von Oracle Spatial, Oracle Text usw. erstellt werden. –

+0

Es ist Community-Wiki. Wenn Sie etwas hinzufügen möchten, können Sie diese Antwort bearbeiten. –

0

Ja, das ist die vollständige Liste. Oracle erstellt automatisch einen Index für jede UNIQUE- oder PRIMARY KEY-Deklaration.

+0

Laut der [angenommenen Antwort] (http://stackoverflow.com/a/2192193/521799) ist das nicht die vollständige Liste ... –

18

Erstens erstellt Oracle nicht immer einen Index, wenn wir einen primären oder eindeutigen Schlüssel erstellen. Wenn es auf dieser Spalte bereits ein Index ist, wird es es stattdessen ...

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> 

... beachten Sie, dass MY_MANUAL_IDX kein eindeutiger Index ist; es spielt keine Rolle ...

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> 

Es gibt einen weiteren Fall, wenn Oracle einen Index automatisch erstellen: LOB Speicher ....

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> 

bearbeiten

Die Datenbank behandelt XMLType selbe wie andere LOBs ...

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

Ich habe Oracle seit ein paar Jahren nicht gemacht, aber ich scheine um sich daran zu erinnern, dass Oracle einen zusammengesetzten Index verwenden könnte, wenn das Feld auf UNIQUE (oder PRIMARY KEY?) gesetzt ist. Ich könnte mich daran erinnern, oder es könnte sich seit der 8i-Linie geändert haben, also würde ich vorschlagen, es zu testen, wenn das nützlich wäre. (um einen zusätzlichen Index zu sparen und den Treffer zu schreiben) – Joe

+0

Ein Beispiel ist immer großartig zum Verständnis. – Guru

+0

@Joe - ja, deine Erinnerung ist korrekt. – APC

3

Nein, wir sind näher kommen, aber das ist noch nicht eine vollständige Liste.

Beim Erstellen der materialisierten Ansicht wird auch automatisch ein Index erstellt, da Oracle bei einer schnellen Aktualisierung die Zeilen schnell identifizieren muss. Für materialisierte Ansichten auf Rowid-Basis wird I_SNAP $ _tablename verwendet. Für materialisierte Ansichten des Primärschlüssels wird der ursprüngliche PK-Name verwendet, der bei Bedarf geändert wird, um ihn eindeutig zu machen.

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

Und noch eine, wenn Sie eine Tabelle mit einer geschachtelten Tabelle erstellen, erhalten Sie einen Index automatisch erstellt. Objektbasierter Speicher kann dies im Allgemeinen tun, da versteckte Tabellen erstellt werden können.

Ich denke, Schema-basierte XMLTypes wird es auch tun.

Verwandte Themen