Oracle会在哪些情况下自动创建索引?

Tad*_*pec 20 database oracle indexing

据我所知(本页),Oracle自动为每个UNIQUE或PRIMARY KEY声明创建一个索引.这是Oracle中自动创建索引的完整案例列表吗?

Tad*_*pec 24

我将尝试整合给定的答案并将其制作社区维基.
因此Oracle会针对以下情况自动创建索引:

  1. APC:对于主键和唯一键,除非已存在此类索引.
  2. APC:用于LOB存储和XMLType.
  3. 加里:对于带有嵌套表的表.
  4. 吉姆哈德森:物化观点.


APC*_*APC 18

首先,在创建主键或唯一键时,Oracle并不总是创建索引.如果该列上已有索引,则会使用它代替...

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> 
Run Code Online (Sandbox Code Playgroud)

...注意这MY_MANUAL_IDX不是一个独特的索引; 没关系......

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> 
Run Code Online (Sandbox Code Playgroud)

还有另一种情况,Oracle将自动创建索引: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>
Run Code Online (Sandbox Code Playgroud)

编辑

数据库将XMLType视为与其他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>    
Run Code Online (Sandbox Code Playgroud)