Уникальный индекс против уникального ограничения, использующего уникальный индекс

Я пытаюсь сравнить две схемы, чтобы убедиться, что они синхронизированы. В одной схеме я вижу уникальный индекс на 2 столбца. В дополнение к этому я вижу уникальное ограничение, использующее уникальный индекс.

Я новичок в Oracle, но мое общее понимание и согласно это уникальное ограничение только гарантирует отсутствие дубликатов, что оно не обязательно индексируется. Для повышения производительности следует добавить индекс по столбцам FK, чтобы обеспечить эффективное выполнение ограничения.

В моей целевой базе данных у меня есть только уникальный индекс HD_FILL_DISPNSNG_FEE_VAL_AK1.

Поскольку этот индекс помечен как «УНИКАЛЬНЫЙ», разве это не обеспечивает как ограничение уникальности, так и преимущества производительности индекса? Я вижу много сообщений на эту тему, таких как указанная ссылка, но у меня возникают проблемы с ее применением в этой конкретной ситуации.

Вопросы. Будут ли какие-либо недостатки в удалении ОГРАНИЧЕНИЯ UNIQUE, поскольку у меня есть индекс уникальности? Аналогично, как уникальное ограничение, использующее индекс, отличается от уникального индекса?

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);

person Paul    schedule 18.09.2015    source источник


Ответы (1)


«что это не обязательно индексируется». Oracle из соображений производительности всегда будет обеспечивать наличие индекса для любого уникального ограничения (включая ограничения первичного ключа). По умолчанию Oracle создает уникальный индекс при создании уникального ограничения.


«Как уникальное ограничение, использующее индекс, отличается от уникального индекса?»

Индекс допускает дублирование записей.

Пример 1: Отложенные ограничения. При вставке индекс должен разрешать повторяющиеся записи, потому что дубликаты разрешены до тех пор, пока транзакция не будет зафиксирована. Затем при фиксации Oracle проверяет наличие дубликатов.

Пример 2: индекс необходим для A, B и C из соображений производительности. Необходимо уникальное ограничение для A. Можно указать Oracle использовать индекс для A, B и C, чтобы применить уникальное ограничение для A, даже если индекс не уникален. Таким образом, Oracle не придется поддерживать еще один индекс.


«Будет ли какой-либо недостаток в удалении UNIQUE CONSTRAINT, поскольку у меня есть уникальный индекс?»

Нет никаких плюсов в снятии ограничения.

person Shannon Severance    schedule 18.09.2015
comment
Re: Oracle из соображений производительности всегда будет обеспечивать наличие индекса для любого ограничения уникальности (включая ограничения первичного ключа). этот УНИКАЛЬНЫЙ индекс? Это звучит избыточно. Re: Индекс допускает дублирование записей. Даже если ИНДЕКС является УНИКАЛЬНЫМ индексом? UNIQUE кажется свойством как индекса, так и ограничения. Re: пример столбца ABC, если для столбца A существует уникальное ограничение, то индекс A, B, C также должен быть уникальным - person Chad; 21.09.2015
comment
@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.. - person Shannon Severance; 21.09.2015
comment
есть ли какое-либо преимущество в том, чтобы также иметь ограничение UNIQUE, которое использует этот индекс UNIQUE? Уникальное ограничение является логической идеей и использованием намерения документа ограничения. И уникальный индекс документирует не намерение, а реализацию. Как было указано в ответе на вопрос, на который вы ссылались, уникальные индексы не могут быть целями ограничений внешнего ключа, а только уникальные ограничения и ограничения первичного ключа. - person Shannon Severance; 21.09.2015