Вопросы об индексах базы данных

  1. Когда индекс базы данных создается для ограничения уникальности для поля или несколько индексов создаются для ограничения уникальности для нескольких полей, эти же индексы можно использовать для повышения эффективности при запросах объектов, во многом аналогично любому другому индексу базы данных используется? Я предполагаю, что индексы, созданные для уникальных ограничений, такие же, как индексы, созданные для повышения эффективности, а само уникальное ограничение является чем-то дополнительным, но я не очень разбираюсь в базах данных.
  2. Можно ли когда-нибудь нарушить ограничение уникальности, включая ограничение нескольких полей (например, field_a и field_b уникальны) каким-либо образом через длинные транзакции и высокий параллелизм и т. Д.? Или, уникальное ограничение предлагает 100% защиту.

3 ответа

Решение

Что касается вопроса 1:

ДА - это индексы, как и любые другие индексы, которые вы определяете, и они используются в планах запросов, например, для повышения производительности... вы можете определять уникальные индексы, не определяя, между прочим, "уникальное ограничение".

Что касается вопроса 2:

ДА - это 100% защита при условии, что механизм БД совместим с ACID и надежен (т.е. не содержит ошибок в этом отношении), и до тех пор, пока вы временно не отключите ограничение.

  1. Да. Уникальным ограничением является индекс (в SQL Server), который будет (может) использоваться в планах запросов.

  2. Это невозможно. Независимо от времени транзакции или проблем параллелизма вы не можете хранить данные в таблице, которая нарушает ограничение (по крайней мере, в SQL Server). Кстати, если ваши транзакции настолько длинные, что вы беспокоитесь об этом, вам нужно переосмыслить то, что вы делаете в контексте этой транзакции. Даже если вы не нарушите ограничения базы данных при длительных транзакциях, ВЫ столкнетесь с другими проблемами.

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

В этом уме:

  1. Всякий раз, когда база данных считает, что доступ через индекс может ускорить процесс, это будет сделано - уникальность здесь не имеет значения. Если на одной таблице существует много индексов, приличная база данных попытается использовать "лучшую" - с разными взглядами на то, что на самом деле означает "лучшая". НО многие базы данных будут использовать только один индекс для получения строки. Поэтому, как правило, БД, как правило, стараются использовать индизы, где поиск приводит к как можно меньшему числу строк. Уникальный индекс довольно хорош в этом.:-)

  2. На самом деле это не одна точка, а две разные точки:

    • Приличная БД не испортит ваш индекс даже для длительных транзакций или большого количества параллелизма. По крайней мере, не нарочно. И если это происходит, то это либо ошибка в программном обеспечении БД, которая должна быть исправлена очень быстро - в противном случае поставщик БД может очень сильно потерять репутацию. Другая возможность состоит в том, что это не приличная БД, а просто постоянная хэш-карта или что-то в этом роде. Если данные действительно имеют значение, то высокий параллелизм и длительные транзакции не являются оправданием.

    • Многозначные уникальные индексы чудовищны: реализации БД отличаются друг от друга, что они считают "уникальными", когда один или несколько ключевых столбцов содержат NULL, Например, вы можете посмотреть документацию PostgreSQL по этому вопросу: http://www.postgresql.org/docs/9.1/interactive/indexes-unique.html

Надеюсь, это прояснит некоторые вещи.

Другие вопросы по тегам