使用唯一索引的唯一索引与唯一约束

时间:2015-09-18 14:49:35

标签: oracle12c

我正在尝试比较两个模式以确保它们同步。在一个模式中,我在2列上看到一个唯一索引。除此之外,我还看到了一个使用唯一索引的唯一约束。

我是Oracle新手,但我的一般理解并根据this一个唯一约束,只能确保没有重复,不一定要编入索引。为了提高性能,应在FK列上添加索引,以便有效地执行约束。

在我的目标数据库中,我只有唯一索引HD_FILL_DISPNSNG_FEE_VAL_AK1。

由于此索引标记为“UNIQUE”,这是否既提供了索引的唯一约束和性能优势呢?我看到很多关于这个主题的帖子,比如引用的链接,但是我在将这个问题应用到这种特殊情况时遇到了麻烦。

问题:由于我有唯一索引,因此删除UNIQUE CONSTRAINT是否有任何缺点?类似地,使用索引的唯一约束如何不同于唯一索引?

CREATE UNIQUE INDEX RXFINODS_O.HD_FILL_DISPNSNG_FEE_VAL_AK1 ON RXFINODS_O.HD_FILL_DISPNSNG_FEE_VAL
(CVRG_TY_CD, VAL_EFF_START_DT)
LOGGING
TABLESPACE RXFINODS_INDEX
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MAXSIZE          UNLIMITED
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
            FLASH_CACHE      DEFAULT
            CELL_FLASH_CACHE DEFAULT
           )
NOPARALLEL;

-- 
-- Non Foreign Key Constraints for Table HD_FILL_DISPNSNG_FEE_VAL 
-- 
ALTER TABLE RXFINODS_O.HD_FILL_DISPNSNG_FEE_VAL ADD (
  CONSTRAINT HD_FILL_DSPSNG_FEE_VAL_AK1
  UNIQUE (CVRG_TY_CD, VAL_EFF_START_DT)
  USING INDEX .HD_FILL_DISPNSNG_FEE_VAL_AK1
  ENABLE VALIDATE);

1 个答案:

答案 0 :(得分:2)

"它不一定被索引。"出于性能原因,Oracle总是会确保存在任何唯一约束的索引(包括主键约束)。默认情况下,Oracle将在创建唯一约束时创建唯一索引。

"使用不同于唯一索引的索引的唯一约束如何?"

索引允许重复输入。

示例1:可取的约束。在插入时,索引需要允许重复条目,因为在事务提交之前允许重复。然后在提交时,Oracle检查重复项。

示例2:A,B和B上需要索引。 C出于性能原因。 A上需要一个独特的约束。可以告诉Oracle使用A,B和A上的索引。 C即使索引是非唯一的,也要对A强制执行唯一约束。因此Oracle不必维护另一个索引。

"因为我有唯一索引,所以删除UNIQUE CONSTRAINT是否有任何缺点?"

删除约束没有好处。