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

时间:2010-01-28 11:27:59

标签: database oracle indexing

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

5 个答案:

答案 0 :(得分:24)

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

  1. APC:对于主键和唯一键,除非此类索引已存在。
  2. APC:适用于LOB存储和XMLType。
  3. Gary:对于带有嵌套表的表。
  4. Jim Hudson:对于物化视图。

答案 1 :(得分: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> 

...请注意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> 

另一种情况是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>

修改

数据库将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>    

答案 2 :(得分:3)

不,我们越来越近,但这还不是一个完整的清单。

创建实体化视图时也会自动创建索引,因为Oracle需要能够在快速刷新时快速识别行。对于基于rowid的物化视图,它使用I_SNAP $ _tablename。对于主键物化视图,它使用原始PK名称,根据需要进行修改以使其唯一。

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

答案 3 :(得分:2)

另外一个,如果你创建一个带有嵌套表的表,你会自动创建一个索引。基于对象的存储通常可以这样做,因为可以创建隐藏表。

我认为基于模式的XMLTypes也会这样做。

答案 4 :(得分:0)

是的,这是完整的清单。 Oracle会自动为每个UNIQUE或PRIMARY KEY声明创建一个索引。