9

我有桌子

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

4

2 回答 2

10

这取决于...

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

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

于 2013-10-25T21:45:30.513 回答
-1

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

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

于 2013-10-25T21:46:38.710 回答