据我所知(this page),Oracle会自动为每个UNIQUE或PRIMARY KEY声明创建一个索引。这是在Oracle中自动创建索引的完整案例列表吗?
答案 0 :(得分:24)
我会尝试整合给定的答案并将其制作社区维基 因此Oracle会针对这种情况自动创建索引:
答案 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声明创建一个索引。