domingo, 2 de noviembre de 2014

Los índices bitmap en sql

Los índices son elementos fundamentales para acelerar las consultas en las aplicaciones que creemos. Generalmente los íncides normales son árboles B-tree que aceleran la velocidad de las queries que se lanzan en una Base de datos evitando que los recorridos en las tablas sean secuenciales. Internamente los índices lo que hacen es  almacenar una lista de rowids de las filas de la tabla con el valor clave.

Los índices bitmaps funcionan de forma diferente.  En un indice bitmap, en vez de una lista de rowids, se crea un mapa de bits para cada valor clave del indice. Cada bit del mapa corresponde a un rowid posible. Si el bit esta en 1, significa que el rowid contiene dicho valor clave. Los indices bitmap ofrecen la misma funcionalidad que los indices B-tree, pero con una representacion interna distinta.


IMPORTANTE: Si la cantidad de valores diferentes  que puede tomar el dominio el indice es pequeá, entonces el indice bitmap sera muy eficiente en cuanto al uso de espacio fisico.

Veamos un ejemplo:

Supongamos que tenemos la siguiente tabla de clientes:

CLIENTE      APELLIDO       ESTADO_CIVIL
1            ALONSO         CASADO
2            GARCIA         SOLTERO
3            LOPEZ          DIVORCIADO
4            SAN MARTIN     SOLTERO


La columna estado civil tiene baja cardinalidad, ya que los valores posibles son muy pocos (ESTADO, CASADO, SOLTERO). Hay solamente tres valores posibles por lo tanto un indice bitmap seria apropiado para esta columna. Sin embargo, no es recomendable un indice bitmap para la columna CLIENTE o APELLIDO, dada su alta cardinalidad.

La representación interna sería la siguiente:

CASADO SOLTERO DIVORCIADO
1                   0                    0
0                   1                    0
0                   0                    1
1                   0                    1

Un indice bitmap puede resolver esta sentencia con gran eficiencia contando la cantidad de unos existentes en el mapa de bits resultante como se muestra en la siguiente figura

select count(*) from CLIENTES
    where ESTADO_CIVIL in ('SOLTERO','DIVORCIADO');



No hay comentarios:

Publicar un comentario