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

Ответы [ 3 ]

2 голосов
/ 17 сентября 2011

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

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

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

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

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

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

1 голос
/ 17 сентября 2011

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

В этом смысле:

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...