【问题标题】:Unique index vs. unique constraint that uses a unique index唯一索引与使用唯一索引的唯一约束
【发布时间】:2015-09-18 14:49:34
【问题描述】:

我正在尝试比较两个模式以确保它们同步。在一个模式中,我在 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);

【问题讨论】:

    标签: oracle12c


    【解决方案1】:

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


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

    索引允许重复条目。

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

    示例 2:出于性能原因,需要在 A、B 和 C 上建立索引。 A 需要唯一约束。可以告诉 Oracle 使用 A、B 和 C 上的索引来强制 A 上的唯一约束,即使该索引是非唯一的。因此 Oracle 不必维护另一个索引。


    “既然我有唯一索引,那么删除 UNIQUE CONSTRAINT 会有什么不利之处吗?”

    移除约束没有任何好处。

    【讨论】:

    • 回复:“Oracle,出于性能原因,总是会确保任何唯一约束(包括主键约束)都有一个索引。” 问:但是如果你有一个唯一索引还有一个使用该唯一索引的唯一约束的任何优势?听起来是多余的。回复:“索引允许重复条目。”即使 INDEX 是 UNIQUE 索引吗? “UNIQUE”似乎是索引和约束的属性。Re:您的“ABC”列示例,如果列 A 本身存在唯一约束,则索引 A、B、C 也应该是唯一的
    • @ChadD,除了 Oracle 不会在 A、B、C 上使用唯一索引来对 A 强制执行唯一约束。(不知道为什么。)create table t (a number, b number, c number, constraint t_a_uk unique (a) using index (create index t_a_b_c_idx on t (a, b, c))) 有效。 create table t (a number, b number, c number, constraint t_a_uk unique (a) using index (create unique index t_a_b_c_idx on t (a, b, c))) 产生 ORA-14196: Specified index cannot be used to enforce the constraint.
    • “还有一个使用唯一索引的唯一约束有什么好处吗?” 唯一约束是一个合乎逻辑的想法,并且使用约束文档的意图。唯一索引不是记录意图,而是实现。正如您链接到的问题的答案中所指出的,唯一索引不能是外键约束的目标,只能是唯一约束和主键约束。
    猜你喜欢
    • 2015-12-29
    • 2011-03-18
    • 2011-11-23
    • 2018-12-02
    • 2014-06-25
    • 1970-01-01
    • 2021-11-02
    • 2014-07-18
    相关资源
    最近更新 更多