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

Foi útil?

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).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top