Oracle:单个多列索引或两个单列索引

时间:2013-10-25 21:34:03

标签: sql performance indexing oracle11g

我有桌子

create table1(
  column1 number(10,
  column2 number(10),
  column3 number(10)
);

column1是主键 column2column3是外键

我在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上。

2 个答案:

答案 0 :(得分:9)

这取决于......

如果您已在column1上拥有综合索引,那么仅column1, column2的索引就不太可能有用。由于column1是前导索引,因此针对仅具有column1作为谓词的表的查询将能够使用复合索引。如果您经常运行需要对索引进行完整扫描的查询,并且column2的存在会大大增加索引的大小,那么仅column1上的索引可能会更有效因为完整的索引扫描需要做更少的I / O.但这是一个非常不寻常的情况。

如果针对该表的某些查询仅在column2上指定谓词,那么仅column2的索引可能会有所帮助。如果column1的相对较少的不同值,Oracle可能会使用复合索引执行索引跳过扫描,以满足仅将column2指定为谓词的查询。但跳过扫描的效率可能远远低于范围扫描,因此仅column2的索引很可能会使这些查询受益。如果column1存在大量不同的值,则跳过扫描的效率会更低,仅column2的索引会更有益。当然,如果您从未使用column2查询表而不在column1上指定谓词,则只需要column2上的索引。

答案 1 :(得分:-1)

索引是提高信息检索性能的结构,即每当您使用SELECT子句时,它将查找索引的键并返回链接到该键的值。但是,索引会增加更新和插入操作的成本,因为它需要更新结构以使其有效地检索信息。

为单列创建索引不会提高读取性能,但会降低写入和更新性能AFAIK。