Возможно ли создать проверочные ограничения / первичные ключи без индексов? - PullRequest
1 голос
/ 04 января 2012

Я работаю над проектом переноса данных, где некоторые таблицы будут загружаться только один раз. То есть таблица будет полностью загружена с использованием только одного параметра «Выбрать из вставки в».

Я хочу обеспечить целостность данных с использованием первичных ключей и ограничений.

В Oracle каждый раз, когда я создаю первичный ключ или ограничение, Oracle автоматически создает для меня соответствующий индекс.

Можно ли отключить создание индекса? Обратите внимание, что я все еще хочу, чтобы ограничение было проверено по мере необходимости ... так, чтобы при отсутствии вероятности, что Oracle действительно необходимо выполнить проверку, он либо создаст индекс (по мере необходимости) ... либо выполнит полное сканирование таблицы .

Причина, по которой я хочу отключить или отложить создание этого индекса, заключается в том, что я заметил, что большинство создаваемых индексов (для ограничений) фактически не используются. Я делаю это, включив мониторинг использования для всех индексов, запустив процесс переноса данных и проверив v $ object_usage.

Ответы [ 2 ]

4 голосов
/ 04 января 2012

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

EDIT:

Если существует индекс, который Oracle может использовать уже для столбцов, используемых в первичном ключе, Oracle будет использовать этот индекс для обеспечения ограничения, уникального или нет. Если Oracle должен создать индекс, он будет уникальным, если только ограничение не является отсроченным, и в этом случае оно будет неуникальным. Спасибо Шеннон и Адаму за комментарии.

0 голосов
/ 04 января 2012

РЕДАКТИРОВАТЬ Бит, отвечающий на вопрос в этом ответе, неправильный.

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я не верю, что это разумно

Возможно повторить действия primary key constraint без фактического создания первичного ключа. Это связано с тем, что ограничение , не являющееся индексом, является частью ограничения PK, фактически является комбинацией not null constraint и unique constraint, которые являются наращиваемыми. У вас тогда нет индекса. Так да. Возможно.

Но:

  1. Идея таблицы, в которой PK используется никогда , не представляется вероятной.
  2. Просто нужно было решить проблемы, возникшие, когда кто-то решил, что чрезмерная увлеченность ПК - это хорошая идея около 10 лет назад.

Я настоятельно рекомендую вам пойти по обычному маршруту и ​​создать первичный ключ. Пространство дешево, и вы, вероятно, пожалеете об этом позже, если не сделаете.

...