jump to navigation

Oracle – Considerando claves sintéticas e índices de clave inversa

Fuente: http://www.ixora.com.au/tips/design/synthetic_keys.htm

Para la mayoría de las entidades definidas en un modelo de datos lógico, debe existir al menos un conjunto de atributos que constituyen una clave candidata. Por ejemplo, un cliente puede ser identificado por su número de seguro social, o un elemento del sistema puede ser identificado por su número de serie.

¿Por qué utilizar claves sintéticas?

Sin embargo, en lugar de esas claves candidatas, una clave sintética puede ser una sola columna numérica generada a partir de una secuencia de números automáticos, esto puede ofrecer una mejor clave principal.

Para considerar esta decisión existen 7  factores a estimar:

Índice de mantenimiento

En general, es necesario generar un índice para las claves independientemente de que sea una clave principal sintética la que se utiliza. Por lo tanto, la adición de una clave sintética aumenta el índice de gastos generales de mantenimiento de las inserciones y borrados.

Join o unión

Si se utiliza una clave sintética, la clave natural no estará disponible en las tablas hijas o dependientes, y será necesario para algunos casos agregar un join extra con la tabla padre.

Tamaño del índice

Como una clave sintética por lo general será de menor tamaño, los índices de clave primaria y foránea serán de menor tamaño, y probablemente generen árboles de derivación menores. Si es este el caso, el uso de estos índices en los joins serían más rápidos, como un escaneo completo por índice.

Tamaño de la tabla

Aunque la adición de una clave sintética tal vez genere una tabla ligeramente más grande y necesite más lecturas de bloque para una lectura completa de la tabla, las tablas que contengan clave foránea serán significativamente menor y esto hará que sea más eficiente.

Actualización de clave

Algunas veces el valor de la clave natural necesita ser actualizado, pero las claves sintéticas no deben ser actualizadas. Si una clave natural es utilizada como clave principal, la actualización de este valor debe ser en cascada lo cual implica un trabajo extra, y para el desarrollador como para el motor de la base de datos dicha actualización puede reducir la concurrencia.

Insert’s desconectado

Para utilizar una clave de sintética en un entorno distribuido con nodos desconectados que necesitan insertar registros, cada nodo debe generar un rango de valores de claves mutuamente exclusivo, de su propio generador de secuencias. La asignación de rangos de claves precisa de una cuidadosa gestión, mientras que no existe tal consideración si se usan claves naturales.

Particionado

Usando una clave sintética limita gravemente la disposición de estrategias de particionado.

La conclusión final en base a estas consideraciones es la utilización de una clave sintética en lugar de una clave natural.

Por qué usar índices de clave inversa

Sin embargo existe un gran peligro de escalabilidad con la generación automática de claves sintéticas. Cada inserción en una tabla requiere una inserción correspondiente a su índice de clave primaria. Si la clave principal son los valores que se generan en orden ascendente, a continuación, todas las inserciones necesitarán cambiar el orden en el árbol B *-. Hay aquí un peligro evidente con el bloque de contención del índice, si varios usuarios intentan realizar inserciones concurrentes.

En las versiones anteriores a Oracle8, la estrategia estándar para evitar este problema es asegurar que la clave de los valores sintéticos no son generados en orden. Esto se hizo para permitir permutar los valores generados por el generador de números de secuencia antes de usarlos. Estos sistemas tienen el efecto de la distribución de las inserciones a lo largo del rango de valores en el índice, por lo tanto, la prevención de la hoja bloque de contención. En Oracle8, el mismo efecto se puede obtener mediante el uso de un índice de clave inversa.

La principal desventaja de la distribución de las inserciones de esta manera es que los datos del índice de densidad de la hoja de bloques suelen ser sólo el 75% de la capacidad en lugar de casi el 100%, haciendo menos eficientes los ‘fast full index scan’ sobre la clave principal. Sin embargo, este camino de acceso no es típico y raramente es de fundamental funcionamiento cuando se utiliza. Por lo tanto, revertir los índices deberá utilizarse en general sólo para los índices sintéticos de clave primaria.


Cabrera Paola    (1329-0454)
Matias Omar Gonzalez    (3301-2528 )
Puntano Maricel    (1328-0030)
Rios Fernando    (1330-0333)
Emmanuel Tramaglia    (3801-2517)
Gricar Francisco    (3401-2219)

Alegre, Santiago   (3701-0148)
Altube, Alejandro   (3701-1197)
Barrionuevo, Milva    (1325-0212)
Seguí, María Victoria   (3701-0508)
Zalazar, Sebastián   (3601-3102)

A %d blogueros les gusta esto: