Técnicas de Oracle Bitmap Index

Buenas tardes de nuevo!

Estamos lanzando la segunda secuencia de nuestro nuevo curso "DBMS relacional" , que completamos un poco de acuerdo con los resultados de la primera ejecución: las clases adicionales en los clústeres MySQL y Postgres resultaron ser demandadas por Docker y varias otras "mejoras de archivos". Así que espere lecciones abiertas (en las que se hayan sacado algunos de los temas anteriores) y materiales interesantes. Hoy profundizamos en las técnicas de Oracle.

Vamos

Los índices de mapa de bits de Oracle son muy diferentes de los índices de árbol B estándar. En las estructuras de mapa de bits, se crea una matriz bidimensional con una columna para cada fila en la tabla indexada. Cada columna representa un valor separado en el índice de mapa de bits. Esta matriz bidimensional muestra cada valor de índice multiplicado por el número de filas en esta tabla.

Oracle descomprime el mapa de bits (con velocidad de recuperación de línea) en el búfer de datos RAM para un escaneo rápido en busca de valores coincidentes. Estos valores coincidentes se pasan a Oracle como una lista de ID de fila, y los valores de ID de fila pueden acceder directamente a la información requerida.



Una ventaja particular de la indexación de mapa de bits se manifiesta cuando una sola tabla incluye varios índices de mapa de bits. El poder de cada columna puede ser bajo. La creación de múltiples índices de mapa de bits proporciona un enfoque muy poderoso para responder rápidamente a consultas SQL complejas.



Usando la metodología de agrupación de mapas de bits, Oracle proporciona una reducción del tiempo de respuesta de menos de un segundo cuando se trabaja con múltiples columnas con una pequeña cantidad de elementos.

También preste atención a las notas importantes sobre los valores máximos del índice de mapa de bits de Oracle .

Por ejemplo, imagine que hay una base de datos de automóviles con una gran cantidad de columnas de baja potencia: car_color, car_make, car_model y car_year. Cada columna contiene menos de 100 valores diferentes, y el índice b-tree sería completamente inútil en una base de datos de 20 millones de automóviles.

Sin embargo, fusionar estos índices en una consulta puede proporcionar un tiempo de respuesta alto mucho más rápido que el método tradicional de leer cada una de las 20 millones de filas en la tabla base. Por ejemplo, supongamos que queremos encontrar el viejo Toyota Corolla azul fabricado en 1981:

select license_plat_nbr from vehicle where color = "blue" and make = "toyota" and year = 1981; 

Para trabajar con esta consulta, Oracle utiliza un método de optimización especializado llamado combinación de índices de mapas de bits. En este método, cada lista de ID de fila (brevemente RID) se forma por separado utilizando mapas de bits, y se utiliza un procedimiento de fusión especial para comparar listas RID y buscar valores superpuestos.

A medida que aumenta el número de valores diferentes, el tamaño del mapa de bits aumenta exponencialmente. Por lo tanto, un índice de 100 valores puede ejecutarse 1,000 veces más rápido que el índice de mapa de bits de 1,000 valores de columna diferentes.

Vale la pena recordar que los índices de mapa de bits son adecuados solo para tablas estáticas y vistas materializadas que se actualizan por la noche y se reconstruyen después de la carga por lotes de filas. Si se producen varios DML por segundo en su tabla, ¡TENGA CUIDADO cuando implemente índices de mapas de bits!

  • 1 a 7 valores clave diferentes: las consultas con índices de mapa de bits de baja potencia son muy rápidas;
  • 8 - 100 valores clave diferentes: con un aumento en el número de valores diferentes, la productividad disminuye proporcionalmente;
  • 100 - 10,000 valores diferentes: con más de 100 valores diferentes, los índices de mapa de bits se vuelven enormes y el rendimiento de SQL cae rápidamente;
  • Más de 10,000 valores clave diferentes: en esta etapa, el rendimiento es diez veces menor que con un índice con 100 valores diferentes.

Los índices de mapas de bits de Oracle son una característica muy poderosa de Oracle, ¡pero existen dificultades!

Deberá utilizar el índice de mapa de bits en los siguientes casos:

  1. La columna de la tabla es ligera: para el manual DRAFT, considere un mapa de bits para cualquier índice con menos de 100 valores diferentes:

     select region, count(*) from sales group by region; 
  2. Tablas DML BAJAS: el uso de inserción / actualización / eliminación debe ser bajo. La actualización de índices de mapas de bits requiere muchos recursos, por lo que son más adecuados para tablas de solo lectura y tablas actualizadas por lotes todas las noches;
  3. Múltiples columnas: sus consultas SQL se refieren a múltiples campos con baja cardinalidad en la instrucción Where. La presencia de índices de mapas de bits facilitará el trabajo del optimizador de Oracle, que realiza una estimación basada en el costo (en resumen, CBO (Optimizador basado en el costo)).

Solucionar problemas de los índices de mapas de bits de Oracle

Los problemas de implementación de índice de mapa de bits más comunes incluyen los siguientes:

  • Tabla pequeña: ¡CBO puede requerir un escaneo completo de la tabla si es demasiado pequeño!
  • Estadísticas incorrectas: asegúrese de analizar el mapa de bits con dbms_stats justo después de la creación:

 CREATE BITMAP INDEX emp_bitmap_idx ON index_demo (gender); exec dbms_stats.gather_index_stats(OWNNAME=>'SCOTT', INDNAME=>'EMP_BITMAP_IDX'); 

  • Prueba de información sobre herramientas: para usar su nuevo índice de mapa de bits, use la información sobre herramientas de Oracle INDEX:

 select /*+ index(emp emp_bitmap_idx) */ count(*) from emp, dept where emp.deptno = dept.deptno; 

Estamos esperando preguntas y comentarios aquí o ven a nuestra nueva lección abierta .

Source: https://habr.com/ru/post/es433090/


All Articles