Estructura de un indice bitmap

Composicion II - Piet Mondrian

Composicion II - Piet Mondrian

El proposito de todo indice es proveer punteros a las filas de una tabla que tienen un valor determinado. En un indice B-tree, este objetivo se logra almacenando una lista de rowids de las filas de la tabla con el valor clave. Oracle almacena cada valor clave en forma repetida para cada fila. En un indice bitmap, en vez de una lista de rowids, Oracle 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. Una funcion interna de Oracle convierte la posicion del bit en el rowid conrrespondiente, de modo tal que los indices bitmap ofrecen la misma funcionalidad que los indices B-tree, a pesar de la diferente representacion interna. Si la cantidad de valores diferentes del indice es chica, entonces el indice bitmap sera muy eficiente en cuanto al uso de espacio fisico.

Supongamos que tenemos la siguiente tabla de clientes:

CLIENTE        APELLIDO       REGION
101            PEREZ          NORTE
102            GARCIA         CENTRO
103            LOPEZ          SUR
104            SAN MARTIN     SUR
105            BROWN          CENTRO
106            CANEPA         CENTRO

La columna region tiene baja cardinalidad, ya que los valores posibles son muy pocos (NORTE, CENTRO, SUR). Hay solamente tres valores posibles para la region 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. Para estos casos un indice B-tree proveera una representacion y acceso mas eficiente.

La siguiente seria la representacion del indice bitmap para la columna REGION. El indice tiene tres mapas de bits, uno para cada region.

NORTE    CENTRO    SUR         
1        0         0
0        1         0
0        0         1
0        0         1
0        1         0
0        1         0

Cada entrada o bit en el indice bitmap se corresponde  a una sola fila en la tabla de clientes. El valor del bit dependera del valor correspondiente de la fila en la tabla. Por ejemplo, para la region NORTE el mapa de bits tiene un 1 en la primer posicion. Eso es porque la primer fila de la tabla de clientes tiene el valor NORTE en la columna REGION. Luego, el mapa de bits tiene todos ceros, indicando que el resto de las filas de la tabla no tiene clientes en la region NORTE.

Una sentencia SQL sobre esta tabla y con el indice bitmap, ser resolveria de la siguiente manera.

select count(*) from CLIENTES
    where REGION in ('NORTE','SUR');

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:

NORTE   CENTRO   SUR   (NORTE O SUR)
1       0        0      1
0       1        0      0
0       0        1      1
0       0        1      1
0       1        0      0
0       1        0      0

La columna “NORTE O SUR” es el mapa de bits resultante utilizado para acceder a la tabla.

Adicionalmente y a diferencia de los indices B-tree, los indices bitmap pueden incluir filas con valore NULL dentro de la estructura del indice.  En cuanto a las tablas particionadas, los indices bitmap se pueden utilizar solo si son locales a la particion. Los indices bitmap globales no son soportados para tablas particionadas.

Anuncios

5 comentarios

  1. Hola Fernando, tengo una tabla que recibe inserts y posee un indice bitmap, lo curioso es que una transacciòn que se ejecute realizando esos inserts siempre y cuando no sea distribuida funciona bien, pero en cambio si la transaccion se ejecuta distribuida donde un frente de aplicacion invoca a otros para realizar una operacion se produce un lockeo y no termina jamas, habria una explicacion razonable para esto ?
    Saludos,
    Sam.

  2. Muy claro amigo, gracias ….

  3. Es una explicación bastante directa y clara, gracias por compartir.

    Juan Valdez

  4. Muchas gracias por la explicación, se entendió muy bien.

  5. con esa cantidad de datos el optimizador se saltara el indice y lanzara full table scan.


Comments RSS TrackBack Identifier URI

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s