我有 table
create table1(
column1 number(10,
column2 number(10),
column3 number(10)
);
column1
是主键column2
和column3
是外键我在2列上创建了唯一约束
alter table table1
add constraint table1_contr1 unique(column1,column2)
using index tablespace tbs1;
当我去在两个列上创建索引时
create index table1_idx1 on table1(column1,coulmn2);
ERROR at line 1:
ORA-01408: such column list already indexed
因此,当我创建唯一约束时,Oracle已经创建了索引。但是,如果我单独创建索引,那就是接受那些
create index table1_idx1 on table1(column1);
create index table2_idx2 on table2(column2);
现在我的问题是,在两个列上都有唯一的约束之后,我仍然需要担心在每个列上创建索引吗?查询表时省略单列索引是否会对性能产生影响?
在oracle 11R2上。
最佳答案
这取决于...
如果您已经在column1
上使用了复合索引,那么仅在column1, column2
上使用索引就不太可能会受益。由于column1
是前导索引,因此仅以column1
作为谓词的表查询将能够使用复合索引。如果您经常运行需要对索引进行完整扫描的查询,而column2
的存在会大大增加索引的大小,则仅对column1
进行索引的效率可能更高,因为完整索引扫描需要减少I/O。但这是一个非常不寻常的情况。
如果对表的某些查询在column2
上指定谓词,则仅对column2
的索引可能会有所帮助。如果column1
的不同值相对较少,则Oracle可能会使用复合索引执行索引跳过扫描,以满足仅将column2
指定为谓词的查询。但是,跳过扫描的效率可能比范围扫描低得多,因此,仅column2
上的索引可能会有益于那些查询。如果column1
有大量不同的值,则跳过扫描的效率甚至更低,仅column2
上的索引将更有益。当然,如果您从未在没有在column2
上指定谓词的情况下使用column1
查询表,则仅在column2
上就不需要索引。
关于sql - Oracle : Single multicolumn index or two single column indexes,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19599773/