Será que fazer uma chave primária em várias colunas gerar índices para todos eles?
-
22-08-2019 - |
Pergunta
Se eu definir uma chave primária em várias colunas em Oracle, eu também precisa criar os índices se eu precisar deles?
Eu acredito que quando você definir uma chave primária de um coluna , você tê-lo indexado por ele; é o mesmo com vários PKs coluna?
Graças
Solução
Não, índices não será criado para os campos individuais.
Se você tem uma chave composit FIELDA, FieldB, FieldC e você
select * from MyTable where FieldA = :a
ou
select * from MyTable where FieldA = :a and FieldB = :b
Em seguida, ele usará este índice (porque eles são os dois primeiros campos na chave)
Se você tiver
select * from MyTable where FieldB = :b and FieldC = :c
Onde você estiver usando partes do índice, mas não o índice cheio, o índice será usado de forma menos eficiente através de um índice pular varredura, varredura do índice cheio, ou varredura de índice rápido completo.
(graças a David Aldridge para a correção)
Outras dicas
Se você criar uma chave primária em colunas (A, B, C), em seguida, a Oracle vai por padrão criar um índice exclusivo em (A, B. C). Você pode dizer Oracle para usar um diferente (não necessariamente único) índice existente como este:
alter table mytable add constraint mytable_pk
primary key (a, b, c)
using index mytable_index;
Você vai ter um índice em várias colunas, que não é o mesmo que ter um índice em cada coluna.
Chave primária implica a criação de um composite unique index
em colunas de chave primária.
Você pode usar um caminho de acesso especial chamado INDEX SKIP SCAN
usar este índice com predicados que não incluem a primeira coluna indexada:
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
Uma chave primária é apenas um índice (original), possivelmente contendo várias colunas
Para B selecione o índice será usado se uma coluna têm baixa cardinalidade única (por exemplo, um tem apenas dois valores). Em geral, você poderia ter adivinhado esta resposta, se você imaginado que colunas não indexadas separadamente, mas indexados concatenação de colunas (não é completamente verdade, mas funciona para primeira aproximação). Portanto, não é, um índice b é mais como um índice || b.
Você pode precisar configurar índices individuais nas colunas, dependendo da sua estrutura de chave primária.
chaves primárias e índices compostos irá criar índices da seguinte maneira. Digamos que eu tenha colunas A, B, C e i a criar a chave primária em (A, B, C). Isso resultará em índices
- (A, B, C)
- (A, B)
- (A)
A Oracle realmente cria um índice em qualquer um dos maioria dos agrupamentos coluna da esquerda. Então ... Se você quiser um índice apenas para a coluna B você vai ter que criar um para ele, bem como a chave primária.
P.S. Eu sei MySQL exibe, isso deixou mais comportamento e eu acho que o SQL Server também é deixado mais
Na Oracle, isso não é uma declaração exata. Ela cria apenas um índice em (A, B, C). não cria (A, B) e índices (A).