Создает ли создание первичного ключа в нескольких столбцах индексы для всех них?
-
22-08-2019 - |
Вопрос
Если я установлю первичный ключ в нескольких столбцах в 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).