Должен ли я указывать как ИНДЕКС, так и УНИКАЛЬНЫЙ ИНДЕКС?

В одной из моих таблиц PostgreSQL у меня есть набор из двух полей, которые будут определены как уникальные в таблице, но также оба будут использоваться вместе при выборе данных. Учитывая это, мне нужно определить только УНИКАЛЬНЫЙ ИНДЕКС, или я должен указать ИНДЕКС в дополнение к УНИКАЛЬНОМУ ИНДЕКСУ?

Этот?

CREATE UNIQUE INDEX mytable_col1_col2_idx ON mytable (col1, col2);

Или это?

CREATE UNIQUE INDEX mytable_col1_col2_uidx ON mytable (col1, col2);
CREATE INDEX mytable_col1_col2_idx ON mytable (col1, col2);

person Matt Huggins    schedule 25.12.2010    source источник


Ответы (1)


Если у вас есть УНИКАЛЬНЫЙ ИНДЕКС, вам также не нужен ИНДЕКС - он был бы излишним. УНИКАЛЬНЫЙ ИНДЕКС — это и ограничение уникальности, и индекс, который можно использовать как любой другой индекс.

Из документации:

Примечание. Предпочтительный способ добавления уникального ограничения в таблицу — ALTER TABLE ... ADD CONSTRAINT. Использование индексов для обеспечения уникальных ограничений можно рассматривать как деталь реализации, к которой нельзя обращаться напрямую. Однако следует помнить, что нет необходимости вручную создавать индексы для уникальных столбцов; это приведет к дублированию автоматически созданного индекса.

Акцент мой.

person Mark Byers    schedule 25.12.2010
comment
Также обратите внимание, что уникальный индекс для каждого поля в отдельности не совпадает с уникальным индексом для обоих полей вместе. Если вам нужен уникальный индекс для каждого отдельного поля по отдельности, индекс с двумя столбцами этого не сделает. - person Scott Marlowe; 26.12.2010
comment
OT, но это также решило мою проблему. Я столкнулся с этим, используя аннотации Hibernate/jpa. Я не был уверен, что установка уникального столбца также добавила индекс. По крайней мере, в Postgres это так, поэтому нет необходимости добавлять отдельный индекс для столбцов. - person Mike Miller; 11.07.2011
comment
Я не совсем уверен, что это правда. В примечании здесь просто говорится, что индекс не нужно создавать вручную, и не то, чтобы не было необходимости в (не уникальном) индексе ИМХО. Глядя на несколько планов выполнения запросов, кажется, подтверждается, что индекс будет использоваться для поиска только тогда, когда для столбца также добавляется другой (не уникальный) индекс. - person jl.; 23.08.2019