【发布时间】:2011-01-10 09:04:32
【问题描述】:
据我所知 (this page),Oracle 会自动为每个 UNIQUE 或 PRIMARY KEY 声明创建一个索引。这是在 Oracle 中自动创建索引的完整案例列表吗?
【问题讨论】:
据我所知 (this page),Oracle 会自动为每个 UNIQUE 或 PRIMARY KEY 声明创建一个索引。这是在 Oracle 中自动创建索引的完整案例列表吗?
【问题讨论】:
我将尝试整合给出的答案并使其成为社区 wiki。
因此,对于这种情况,Oracle 会自动创建索引:
【讨论】:
首先,当我们创建主键或唯一键时,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>
【讨论】:
不,我们越来越近了,但这还不是一个完整的列表。
创建物化视图时还会自动创建一个索引,因为 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
【讨论】:
另外一个,如果你创建一个带有嵌套表的表,你会得到一个自动创建的索引。一般来说,基于对象的存储可以做到这一点,因为可以创建隐藏表。
我认为基于模式的 XMLTypes 也可以。
【讨论】:
是的,这是完整的列表。 Oracle 自动为每个 UNIQUE 或 PRIMARY KEY 声明创建一个索引。
【讨论】: