2010-01-28 138 views

回答

20

我会尝试合并给定的答案并使其成为社区wiki。
所以指数是由Oracle这样的情况下自动创建:

  1. APC:对于主键和唯一键,除非这些指标已经存在。
  2. APC:用于LOB存储和XMLType。
  3. Gary:用于嵌套表的表格。
  4. Jim Hudson:物化视图。
+0

“LOB存储”情况可能也会导致其他复杂数据类型的索引。虽然我没有测试过这个。我期望索引由Oracle Spatial,Oracle Text等创建。 – 2010-02-03 15:18:54

+0

它是社区wiki。如果你想添加任何东西,你可以编辑这个答案。 – 2010-02-04 08:03:13

0

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

+0

根据[接受的答案](http://stackoverflow.com/a/2192193/521799)这不是完整的列表... – 2013-12-15 07:40:24

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>  
+0

我几年没有完成Oracle,但我似乎回想一下,如果被设置为UNIQUE(或PRIMARY KEY?)的字段是第一个字段,Oracle可以使用复合索引。我可能会记错,或者自从8i系列以来它可能已经发生了变化,所以我建议您测试它是否有用。 (从保存一个额外的索引,并在写入中取得成功) – Joe 2010-01-28 12:21:11

+0

一个例子总是非常适合理解。 – Guru 2010-01-28 12:29:52

+0

@Joe - 是的,你的回忆是正确的。 – APC 2010-01-28 12:30:03

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 
2

而另一个,如果您创建一个嵌套表的表,你会得到一个自动创建的索引。一般来说基于对象的存储可以做到这一点,因为可以创建隐藏表。

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

相关问题