Создает ли первичный ключ в нескольких столбцах индексы для всех них? - PullRequest
9 голосов
/ 10 февраля 2009

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

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

Спасибо

Ответы [ 8 ]

12 голосов
/ 10 февраля 2009

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

Если у вас есть композитный ключ 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

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

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

4 голосов
/ 10 февраля 2009

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

alter table mytable add constraint mytable_pk 
primary key (a, b, c)
using index mytable_index;
2 голосов
/ 10 февраля 2009

Первичный ключ подразумевает создание 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
2 голосов
/ 10 февраля 2009

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

0 голосов
/ 11 марта 2010

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

0 голосов
/ 11 февраля 2009

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

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

  • (А, В, С)
  • (A, B)
  • (А) * * 1 010

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

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

0 голосов
/ 10 февраля 2009

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

0 голосов
/ 10 февраля 2009

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

...