oracle - tipos - ¿La creación de una clave principal en varias columnas genera índices para todos ellos?
que es una clave principal en access (8)
Es posible que deba establecer índices individuales en las columnas en función de la estructura de clave principal.
Las claves primarias compuestas y los índices crearán índices de la siguiente manera. Supongamos que tengo las columnas A, B, C e ia, creo la clave primaria en (A, B, C). Esto dará como resultado los índices
- (A B C)
- (A, B)
- (UN)
Oracle realmente crea un índice en cualquiera de los grupos de columnas más a la izquierda. Entonces ... Si quiere un índice solo en la columna B, tendrá que crear uno así como también la clave principal.
PD Sé que MySQL exhibe este comportamiento y me parece que SQL Server también se queda más
Si configuro una clave principal en varias columnas en Oracle, ¿también necesito crear los índices si los necesito?
Creo que cuando establece una clave principal en una columna, la indexa; ¿Es lo mismo con múltiples columnas PK?
Gracias
La clave principal implica la creación de un composite unique index
en columnas de clave primaria.
Puede usar una ruta de acceso especial llamada INDEX SKIP SCAN
para usar 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
Obtendrá un índice en varias columnas, que no es lo mismo que tener un índice en cada columna.
Para B, el índice de selección se usará si la columna a tiene solo una cardinalidad baja (por ejemplo, a tiene solo 2 valores). En general, podría haber adivinado esta respuesta si imaginara que las columnas no están indexadas por separado, sino que tienen una concatenación indexada de columnas (no es completamente cierto, pero funciona para la primera aproximación). Entonces, no es un índice b, es más como un índice || b.
Si crea una clave principal en las columnas (A, B, C), Oracle creará de manera predeterminada un índice único en (A, B. C). Puede decirle a Oracle que use un índice existente diferente (no necesariamente único) como este:
alter table mytable add constraint mytable_pk
primary key (a, b, c)
using index mytable_index;
Una clave principal es solo un índice (único), que posiblemente contenga varias columnas
En Oracle, esa no es una declaración precisa. Crea solo 1 índice en (A, B, C). No crea índices (A, B) y (A).
No, los índices no se crearán para los campos individuales.
Si tiene una clave Composit FieldA, FieldB, FieldC y usted
select * from MyTable where FieldA = :a
o
select * from MyTable where FieldA = :a and FieldB = :b
Luego usará este índice (porque son los primeros dos campos de la clave)
Si usted tiene
select * from MyTable where FieldB = :b and FieldC = :c
Cuando utiliza partes del índice, pero no el índice completo, el índice se utilizará de manera menos eficiente mediante un escaneo de índice de salteo, escaneo de índice completo o escaneo rápido de índice completo.
(Gracias a David Aldridge por la corrección)