2009-02-10 16 views

Respuesta

12

No, no se crean los índices para los campos individuales.

Si usted tiene un composit clave FieldA, FieldB, FieldC y

select * from MyTable where FieldA = :a 

o

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

entonces se usará este índice (ya que ellos son los primeros dos campos en la clave)

Si tiene

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

Donde está utilizando partes del índice, pero no el índice completo, el índice se usará de manera menos eficiente a través de una exploración de omisión de índice, exploración de índice completa o exploración rápida de índice completo.

(Gracias a David Aldridge para la corrección)

+1

Es posible que desee corregir la parte de uso del índice: una exploración de omisión de índice, una exploración de índice completa o una exploración de índice completa rápida son mecanismos que permiten usar el índice para todos esos casos. –

2

se vuelve al índice a través de varias columnas, que no es lo mismo que tener un índice en cada columna.

0

Una clave primaria es sólo un índice (única), que posiblemente contiene varias columnas

+0

El índice no tiene que ser del tipo único para admitir una clave principal. En algunos casos (restricciones diferibles o un PK en una vista materializada) definitivamente querría un índice no único. –

4

Si crea una clave principal en columnas (A, B, C) a continuación, Oracle por defecto crear un índice único en (A, B, C). Se puede decir que Oracle para utilizar una (no necesariamente único) de índice diferente existentes así: se utilizará

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

Para B índice de selección si la columna tiene una única baja cardinalidad (por ejemplo, un solo tienen 2 valores). En general, podría haber adivinado esta respuesta si imaginara que las columnas no se indexan por separado, sino que concatena la indexación de las columnas (no es completamente cierto, pero funciona para la primera aproximación). Así que no es un índice, b, es más como un índice || b.

2

La clave principal implica crear un composite unique index en las columnas de clave principal.

Puede utilizar una ruta de acceso especial llamado INDEX SKIP SCAN utilizar este índice con predicados que no incluyen la primera columna 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 
0

Es posible que necesite para establecer índices individuales en las columnas en función de su clave primaria estructura.

Las claves primarias compuestas y los índices crearán índices de la siguiente manera. Supongamos que tengo las columnas A, B, C y yo, y creamos la clave primaria en (A, B, C).Esto dará lugar a los índices

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

Oracle en realidad crea un índice en cualquiera de los más a la izquierda agrupaciones de columnas. Entonces ... Si quiere un índice solo en la columna B, tendrá que crear uno así como también la clave principal.

P.S. Sé que MySQL exibió este comportamiento más a la izquierda y creo que SQL Server también se quedó más

+0

Oracle solo creará un índice, en (A, B, C). Puede crear los demás, pero Oracle necesita y requiere solo un índice para aplicar una clave principal. Debe incluir todas las columnas del PK. – redcayuga

+0

Un índice en (A, B, C) puede ser utilizado fácilmente por una consulta que solo tiene A en su cláusula WHERE. Oracle solía requerir el uso de un índice de "la mayoría de los casos", pero las versiones más nuevas pueden omitir el extremo izquierdo, como han señalado otros. – redcayuga

0

En Oracle, esa no es una declaración precisa. Crea solo 1 índice en (A, B, C). No crea índices (A, B) y (A).

Cuestiones relacionadas