sql >> Base de Datos >  >> RDS >> Oracle

¿Buena práctica para usar índices inversos en claves sustitutas? (Oráculo)

En general, si no está usando RAC, no hay razón para usar un índice de clave inversa.

Desde el punto de vista del rendimiento, es mucho mejor tener uno o dos bloques calientes en un momento dado que estén sujetos a inserciones porque eso esencialmente garantiza que los bloques calientes estarán en el caché del búfer y el INSERT no tendrá que incurrir en el costo de leer el bloque del disco. Si tiene inserciones en bloques aleatorios en un índice, existe una probabilidad mucho mayor de que el bloque que desea haya quedado fuera de la memoria caché e incurra en el costo de una E/S física.

El costo de mantener un índice equilibrado es bastante mínimo, pero incluso eso favorece a un índice estándar. Si tiene una clave primaria generada por secuencia con un índice normal, Oracle hará un División de bloque 90/10 en el bloque más a la derecha cuando ese bloque se llena. Por el contrario, si tiene un índice de clave inversa, Oracle tiene que hacer Divisiones de bloque 50/50 cada vez que un bloque determinado se llena. Una división de bloques 50/50 copia la mitad de los datos del bloque anterior al bloque nuevo, una división de bloques 90/10 solo copia el valor de datos más a la derecha en el bloque nuevo. La división de bloques 90/10, por lo tanto, es mucho más barata que una división de bloques 50/50 y necesitaría hacer aproximadamente la misma cantidad de divisiones de bloques, independientemente del tipo de índice que elija. Por lo tanto, el costo de mantener un índice regular es menor que el costo de mantener un índice de clave inversa, incluso ignorando el efecto del caché.

La razón por la que consideraría usar un índice de clave inversa sería que está usando RAC y quiere evitar el costo de tener muchos nodos RAC peleando por el mismo bloque activo. Si tiene que enviar constantemente el bloque activo de un nodo a otro para hacer la siguiente inserción, puede valer la pena usar un índice de clave inversa para reducir esa contención. Si tiene licencia para la opción de particionamiento, sería mejor aún usar un índice particionado hash en su lugar (esto se puede hacer ya sea que las tablas estén particionadas o no). Si no tiene licencia para la opción de particionamiento, un índice de clave inverso puede ser lo suficientemente bueno para resolver la disputa en el bloque activo para no requerir que licencie el particionamiento.