Создает ли создание первичного ключа в нескольких столбцах индексы для всех них?

StackOverflow https://stackoverflow.com/questions/532037

Вопрос

Если я установлю первичный ключ в нескольких столбцах в Oracle, нужно ли мне также создавать индексы, если они мне понадобятся?

Я считаю, что когда вы устанавливаете первичный ключ на один столбец, вы проиндексировали его по нему;то же самое с PKS с несколькими столбцами?

Спасибо

Это было полезно?

Решение

Нет, индексы не будут создаваться для отдельных полей.

Если у вас есть составной ключ FieldA, FieldB, FieldC и вы

select * from MyTable where FieldA = :a 

или

select * from MyTable where FieldA = :a and FieldB = :b

Затем он будет использовать этот индекс (потому что это первые два поля в ключе).

Если у вас есть

select * from MyTable where FieldB = :b and FieldC = :c

Если вы используете части индекса, но не полный индекс, индекс будет использоваться менее эффективно при сканировании с пропуском индекса, полном сканировании индекса или быстром сканировании с полным индексом.

(Спасибо Дэвиду Олдриджу за исправление)

Другие советы

Если вы создадите первичный ключ для столбцов (A, B, C), то Oracle по умолчанию создаст уникальный индекс для (A, B.В).Вы можете указать Oracle использовать другой (не обязательно уникальный) существующий индекс, подобный этому:

alter table mytable add constraint mytable_pk 
primary key (a, b, c)
using index mytable_index;

Вы получите один индекс по нескольким столбцам, что не то же самое, что иметь индекс по каждому столбцу.

Первичный ключ подразумевает создание composite unique index по столбцам первичного ключа.

Вы можете использовать специальный путь доступа, называемый INDEX SKIP SCAN использовать этот индекс с предикатами, которые не включают первый индексированный столбец:

SQL> CREATE TABLE t_multiple (mul_first INTEGER NOT NULL, mul_second INTEGER NOT NULL, mul_data VARCHAR2(200))
  2  /
Table created

SQL> ALTER TABLE t_multiple ADD CONSTRAINT pk_mul_first_second PRIMARY KEY (mul_first, mul_second)
  2  /
Table altered

SELECT  /*+ INDEX_SS (m pk_mul_first_second) */
    *
FROM    t_multiple m
WHERE   mul_second = :test 

SELECT STATEMENT, GOAL = ALL_ROWS                            
 TABLE ACCESS BY INDEX ROWID       SCOTT    T_MULTIPLE
  INDEX SKIP SCAN                  SCOTT    PK_MUL_FIRST_SECOND

Первичный ключ - это только один (уникальный) индекс, возможно, содержащий несколько столбцов

Для B select index будет использоваться, если столбец a имеет только низкую мощность (напримерa имеют только 2 значения).В общем, вы могли бы догадаться об этом ответе, если бы представляли, что столбцы индексируются не отдельно, а индексированной конкатенацией столбцов (это не совсем верно, но это работает в первом приближении).Так что это не индекс a, b, это больше похоже на индекс a ||b.

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

Составные первичные ключи и индексы будут создавать индексы следующим образом.Допустим, у меня есть столбцы A, B, C, и я создаю первичный ключ для (A, B, C).Это приведет к появлению индексов

  • (A, B, C)
  • (A, B)
  • (А)

Oracle фактически создает индекс для любой из самых левых групп столбцов.Итак...Если вам нужен индекс только для столбца B, вам нужно будет создать индекс для него, а также первичный ключ.

P.S.Я знаю, что MySQL демонстрирует это наиболее левостороннее поведение, и я думаю, что SQL Server также наиболее левосторонний

В Oracle это неточное утверждение.Он создает только 1 индекс на (A, B, C).Не создает индексы (A,B) и (A).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top