Un índice de mapa de bits es un tipo especial de índice de base de datos que utiliza mapas de bits .
Los índices de mapa de bits se han considerado tradicionalmente como buenos para columnas de baja cardinalidad , que tienen una cantidad modesta de valores distintos, ya sea de forma absoluta o relativa a la cantidad de registros que contienen los datos. El caso extremo de baja cardinalidad son los datos booleanos (por ejemplo, ¿tiene acceso a Internet un residente de una ciudad?), que tienen dos valores, Verdadero y Falso. Los índices de mapa de bits utilizan matrices de bits (comúnmente llamadas mapas de bits) y responden a las consultas realizando operaciones lógicas bit a bit en estos mapas de bits. Los índices de mapa de bits tienen una ventaja significativa en cuanto a espacio y rendimiento sobre otras estructuras para la consulta de dichos datos. Su desventaja es que son menos eficientes que los índices de árbol B tradicionales para columnas cuyos datos se actualizan con frecuencia: en consecuencia, se emplean con más frecuencia en sistemas de solo lectura que están especializados en consultas rápidas, por ejemplo, almacenes de datos, y generalmente no son adecuados para aplicaciones de procesamiento de transacciones en línea .
Algunos investigadores sostienen que los índices de mapa de bits también son útiles para datos de cardinalidad moderada o incluso alta (por ejemplo, datos de valor único) a los que se accede de manera de solo lectura, y las consultas acceden a múltiples columnas indexadas en mapa de bits utilizando ampliamente los operadores AND , OR o XOR . [1]
Los índices de mapa de bits también son útiles en aplicaciones de almacenamiento de datos para unir una tabla de hechos grande a tablas de dimensiones más pequeñas , como aquellas dispuestas en un esquema de estrella .
Continuando con el ejemplo del acceso a Internet, un índice de mapa de bits puede verse lógicamente de la siguiente manera:
A la izquierda, Identificador se refiere al número único asignado a cada residente, TieneInternet son los datos que se van a indexar, el contenido del índice de mapa de bits se muestra como dos columnas bajo el encabezado bitmaps . Cada columna en la ilustración de la izquierda bajo el encabezado Bitmaps es un mapa de bits en el índice de mapa de bits. En este caso, hay dos mapas de bits de este tipo, uno para "tiene internet" Sí y otro para "tiene internet" No . Es fácil ver que cada bit en el mapa de bits Y muestra si una fila en particular se refiere a una persona que tiene acceso a Internet. Esta es la forma más simple de índice de mapa de bits. La mayoría de las columnas tendrán más valores distintos. Por ejemplo, es probable que el monto de ventas tenga una cantidad mucho mayor de valores distintos. Las variaciones en el índice de mapa de bits también pueden indexar estos datos de manera efectiva. Revisamos brevemente tres de estas variaciones.
Nota: Muchas de las referencias citadas aquí se revisan en (John Wu (2007)). [2] Para aquellos que puedan estar interesados en experimentar con algunas de las ideas mencionadas aquí, muchas de ellas se implementan en software de código abierto como FastBit, [3] la biblioteca C++ Lemur Bitmap Index, [4] la biblioteca Java Roaring Bitmap [5] y el sistema Apache Hive Data Warehouse.
Por razones históricas, la compresión de mapas de bits y la compresión de listas invertidas se desarrollaron como líneas de investigación separadas, y solo más tarde se reconoció que resolvían esencialmente el mismo problema. [6]
El software puede comprimir cada mapa de bits en un índice de mapa de bits para ahorrar espacio. Se ha trabajado mucho en este tema. [7] [8] Aunque hay excepciones como los mapas de bits Roaring, [9] los algoritmos de compresión de mapa de bits suelen emplear codificación de longitud de ejecución , como el código de mapa de bits alineado por bytes, [10] el código híbrido alineado por palabras, [11] la compresión híbrida alineada por palabras particionadas (PWAH), [12] la compresión híbrida alineada por palabras de lista de posiciones, [13] el índice adaptativo comprimido (COMPAX), [14] el híbrido alineado por palabras mejorado (EWAH) [15] y el conjunto de enteros componibles 'N' comprimidos (CONCISE). [16] [17] Estos métodos de compresión requieren muy poco esfuerzo para comprimir y descomprimir. Más importante aún, los mapas de bits comprimidos con BBC, WAH, COMPAX, PLWAH, EWAH y CONCISE pueden participar directamente en operaciones bit a bit sin descompresión. Esto les da ventajas considerables sobre las técnicas de compresión genéricas como LZ77 . La compresión BBC y sus derivados se utilizan en un sistema de gestión de bases de datos comercial . BBC es eficaz tanto para reducir los tamaños de índice como para mantener el rendimiento de las consultas . BBC codifica los mapas de bits en bytes , mientras que WAH codifica en palabras, lo que se adapta mejor a las CPU actuales . "Tanto en datos sintéticos como en datos de aplicaciones reales, los nuevos esquemas de alineación de palabras utilizan solo un 50% más de espacio, pero realizan operaciones lógicas en datos comprimidos 12 veces más rápido que BBC". [18] Se informó que los mapas de bits PLWAH ocupan el 50% del espacio de almacenamiento consumido por los mapas de bits WAH y ofrecen un rendimiento hasta un 20% más rápido en operaciones lógicas . [13] Se pueden hacer consideraciones similares para CONCISE [17] y Enhanced Word-Aligned Hybrid. [15]
El rendimiento de esquemas como BBC, WAH, PLWAH, EWAH, COMPAX y CONCISE depende del orden de las filas. Una simple ordenación lexicográfica puede dividir el tamaño del índice por 9 y hacer que los índices sean varias veces más rápidos. [19] Cuanto más grande sea la tabla, más importante es ordenar las filas. También se han propuesto técnicas de reorganización para lograr los mismos resultados de ordenación al indexar datos en tiempo real. [14]
Los índices de mapa de bits básicos utilizan un mapa de bits para cada valor distinto. Es posible reducir la cantidad de mapas de bits utilizados utilizando un método de codificación diferente . [20] [21] Por ejemplo, es posible codificar valores distintos de C utilizando mapas de bits log(C) con codificación binaria . [22]
Esto reduce la cantidad de mapas de bits, lo que permite ahorrar aún más espacio, pero para responder a cualquier consulta, se debe acceder a la mayoría de los mapas de bits. Esto hace que potencialmente no sea tan eficaz como escanear una proyección vertical de los datos base, también conocida como vista materializada o índice de proyección. Encontrar el método de codificación óptimo que equilibre el rendimiento de la consulta (arbitraria), el tamaño del índice y el mantenimiento del índice sigue siendo un desafío.
Sin considerar la compresión, Chan y Ioannidis analizaron una clase de métodos de codificación de múltiples componentes y llegaron a la conclusión de que la codificación de dos componentes se encuentra en el punto intermedio entre el rendimiento y el tamaño del índice y, por lo tanto, representa el mejor equilibrio entre el tamaño del índice y el rendimiento de la consulta. [20]
En el caso de las columnas de alta cardinalidad, resulta útil agrupar los valores, donde cada uno de ellos cubre varios valores, y construir los mapas de bits para representar los valores de cada uno de ellos. Este enfoque reduce la cantidad de mapas de bits utilizados independientemente del método de codificación. [23] Sin embargo, los índices agrupados solo pueden responder a algunas consultas sin examinar los datos base. Por ejemplo, si un intervalo cubre el rango de 0,1 a 0,2, cuando el usuario solicita todos los valores menores que 0,15, todas las filas que caen en el intervalo son posibles coincidencias y deben comprobarse para verificar si en realidad son menores que 0,15. El proceso de verificación de los datos base se conoce como verificación de candidatos. En la mayoría de los casos, el tiempo empleado por la verificación de candidatos es significativamente mayor que el tiempo necesario para trabajar con el índice de mapa de bits. Por lo tanto, los índices agrupados presentan un rendimiento irregular. Pueden ser muy rápidos para algunas consultas, pero mucho más lentos si la consulta no coincide exactamente con un intervalo.
El concepto de índice de mapa de bits fue introducido por primera vez por el Profesor Israel Spiegler y Rafi Maayan en su investigación "Consideraciones de almacenamiento y recuperación de bases de datos binarias", publicada en 1985. [24] El primer producto de base de datos comercial que implementó un índice de mapa de bits fue el Modelo 204 de Computer Corporation of America . Patrick O'Neil publicó un artículo sobre esta implementación en 1987. [25] Esta implementación es un híbrido entre el índice de mapa de bits básico (sin compresión) y la lista de identificadores de fila (lista RID). En general, el índice está organizado como un árbol B+ . Cuando la cardinalidad de la columna es baja, cada nodo de hoja del árbol B contendría una larga lista de RID. En este caso, se requiere menos espacio para representar las listas RID como mapas de bits. Dado que cada mapa de bits representa un valor distinto, este es el índice de mapa de bits básico. A medida que aumenta la cardinalidad de la columna, cada mapa de bits se vuelve disperso y puede requerir más espacio en disco para almacenar los mapas de bits que para almacenar el mismo contenido como listas RID. En este caso, cambia para usar las listas RID, lo que lo convierte en un índice de árbol B+ . [26] [27]
Una de las razones más importantes para utilizar índices de mapa de bits es que los resultados intermedios que se generan a partir de ellos también son mapas de bits y se pueden reutilizar de manera eficiente en operaciones posteriores para responder consultas más complejas. Muchos lenguajes de programación admiten esto como una estructura de datos de matriz de bits. Por ejemplo, Java tiene la BitSet
clase.
Algunos sistemas de bases de datos que no ofrecen índices de mapa de bits persistentes utilizan mapas de bits internamente para acelerar el procesamiento de consultas. Por ejemplo, las versiones 8.1 y posteriores de PostgreSQL implementan una optimización de "exploración de índice de mapa de bits" para acelerar operaciones lógicas arbitrariamente complejas entre índices disponibles en una sola tabla.
Para tablas con muchas columnas, el número total de índices distintos para satisfacer todas las consultas posibles (con condiciones de filtrado de igualdad en cualquiera de los campos) crece muy rápido y se define mediante esta fórmula:
Un escaneo de índice de mapa de bits combina expresiones en diferentes índices, por lo que requiere solo un índice por columna para admitir todas las consultas posibles en una tabla.
La aplicación de esta estrategia de acceso a los índices de árbol B también puede combinar consultas de rango en múltiples columnas. En este enfoque, se crea un mapa de bits temporal en memoria con un bit para cada fila de la tabla (1 MB puede almacenar más de 8 millones de entradas). A continuación, los resultados de cada índice se combinan en el mapa de bits mediante operaciones bit a bit . Después de evaluar todas las condiciones, el mapa de bits contiene un "1" para las filas que coinciden con la expresión. Finalmente, se recorre el mapa de bits y se recuperan las filas coincidentes. Además de combinar índices de manera eficiente, esto también mejora la localidad de referencia de los accesos a la tabla, porque todas las filas se obtienen secuencialmente de la tabla principal. [30] El mapa de bits interno se descarta después de la consulta. Si hay demasiadas filas en la tabla para usar 1 bit por fila, se crea en su lugar un mapa de bits "con pérdida", con un solo bit por página de disco. En este caso, el mapa de bits solo se usa para determinar qué páginas se deben obtener; luego, los criterios de filtro se aplican a todas las filas en las páginas coincidentes.
{{cite journal}}
: Requiere citar revista |journal=
( ayuda ){{cite journal}}
: Requiere citar revista |journal=
( ayuda )