Oracle no crea índices para las claves foráneas


Cuando se define una restricción de clave foránea en Oracle, el motor no crea un índice para la columna que se restringe. Eso significa que cualquier consulta sobre la tabla del estilo

select *
from detalle
where id_maestro = 10

no serán optimizadas. Es un regla en el 99% de los casos que ese índice será necesario.

En el ejemplo la clave foránea sería la que hace que la columna id_maestro de la tabla detalle es la clave primaria de otra tabla.

Anuncios

7 pensamientos en “Oracle no crea índices para las claves foráneas

  1. Estamos suponiendo que la columna id_maestro, que es clave foranea (FK) en la tabla DETALLE no ejerce también el papel de clave primaria (PK)???

    Es decir,

    Tenemos una tabla maestra POBLACION donde el campo cd_poblacion en PK

    entonces tenemos otra tabla de relación PERSONA donde la pk es nif, hay otros muchos campos entres ello cd_ploblacion que es simplemente FK. En este caso el motor no crea índice para esta columna. Cierto?

    pero si tenemos por ejemplo la tabla CPOSTALES cuyas PK son cd_poblacion y cd_cp formando ambas una clave primaria compuesta, debo entender que el motor no crea índice sobre la columna cd_poblacion?

  2. Si cd_poblacion y cd_cp forman parte de la clave primaria de cpostales, oracle te obliga a que haya un índice compuesto por cd_poblacion y cd_cp, pero no hay un índice para la columna cp_poblacion solita.

  3. Supongo que oracle y cualquier motor razonablemente crea indices automaticamente solo cuando lo necesita….
    En una PK lo necesita (por que debe ser unique, y para verificarlo, debe tener los datos ordenados para hacerlo rapidamente)
    Para una FK no necesita un indice en la comlumna de la FK, simplemente antes debe buscar en la tabla a la que apunta la FK, que el valor sea correcto, y luego inserta sin importar el orden.

    OK, que pasa si borramos un resgistro de la tabla master. Podriamos decir que oracle va a transpirar un poco buscando las FK de tablas detalle que apuntan a ese registro de la tabla master. Es este el precio del optimismo de Oracle?. A si, se le habrá ocurrido a esta gente poner un contador de referencias en los registros de la tabla master? No creo que sean muy tontos estos chicos.

    Vidente Natural – Parapsicologo

  4. El problema es cuando necesitamos usar la columna que es FK para hacer búsquedas. Ahí, por más que Oracle no lo cree, debemos crear el índice nosotros para evitar la lectura innecsaria de todos los bloques de la tabla.
    La base FirebirdSQL los crea automáticamente, ese es el ejemplo que yo conozco.

  5. Simplemente queria agregar que: el que no halla indices en tablas con foreign key tambien puede traer problemas al hacer operaciones DML ya que se produce el bloqueo de la tabla completa. Por mas que hagas operaciones en registros que no tengan relacion con otro en la tabla hijo, se debe esperar al commit correspondiente (o en su defecto kill session).

  6. Una clave foranea no es candidatra a indice cuando se utiliza alguno de sus atributos en la clausula where de alguna consulta y su frecuencia de modificacion es baja..(Verdadero o falso?) Justifica tu respuesta

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s