una mejor representación de un índice de mapa de bits, es si se les da el ejemplo anterior:
Identifier Gender RowID
1 Female R1
2 Male R2
3 Male R3
4 Unspecified R4
5 Female R5
el índice de mapa de bits en la columna de género sería (conceptualmente) tener este aspecto:
Gender R1 R2 R3 R4 R5
Female 1 0 0 0 1
Male 0 1 1 0 0
Unspecified 0 0 0 1 0
Bitmap los índices se usan cuando el número de valores distintos en una columna es relativamente bajo (considere lo contrario donde todos los valores son únicos: el índice de mapa de bits sería tan ancho como cada fila, y). trix.)
Así, con este índice en su lugar una consulta como
SELECT * FROM table1 WHERE gender = 'Male'
la base de datos busca una coincidencia en los valores de género en el índice, busca todos los ROWIDs donde el bit se pone a 1, y luego va y obtiene los resultados de la tabla.
una consulta como:
SELECT * FROM table1 WHERE gender IN ('Male', 'Unspecified')
obtendría los bits 1 para el varón, los bits 1 para especificar, hacen un bit a bit-OR luego ir obtener las filas donde los bits resultantes son 1.
Entonces, las ventajas de usar un índice de mapa de bits sobre un índice de árbol ab * son el almacenamiento (con baja cardinalidad, los índices de mapa de bits son bastante compactos) y la capacidad de realizar operaciones bit a bit antes de resolver los rowids reales, que pueden ser bastante rápidos.
Tenga en cuenta que los índices de mapa de bits pueden tener implicaciones de rendimiento con inserciones/eliminaciones (conceptualmente, agrega/elimina una columna del mapa de bits y lo ajusta en consecuencia ...) y puede crear mucha contención como actualización en una fila puede bloquear la entrada de mapa de bits correspondiente y no puede actualizar una fila diferente (con el mismo valor de mapa de bits) hasta que la primera actualización se confirme o se retrotraiga.
¿Escanearía la base de datos todo el mapa de bits para 'No especificado' para buscar todas las filas correspondientes o hay algún caso de estructura de búsqueda? – Beginner
@Beginner, consulte "Estructura de almacenamiento de mapa de bits" aquí: https://docs.oracle.com/database/121/CNCPT/indexiot.htm#CNCPT88851 –
Esta es la mejor explicación que he leído sobre por qué los índices de mapas de bits pueden ser útil. Sin embargo, en lo que todavía no estoy claro es por qué un índice de mapa de bits sería mejor que un índice normal de árbol b al buscar solo en una ** columna **. Un índice b-tree también debería permitirme determinar rápidamente el subconjunto de filas que corresponden a 'Male' o' Female' o 'Male | Unspecified', ¿verdad? –