Oracle Bitmap Index

Summary: in this tutorial, you will learn how to use the Oracle bitmap index for indexing columns with low cardinality.

Introduction to Oracle bitmap index #

We will use the members table created in the CREATE INDEX tutorial for the demonstration.

The following query  finds all female members of the  members table:

SELECT 
    *
FROM
    members
WHERE
    gender = 'F';Code language: SQL (Structured Query Language) (sql)

The gender column has two distinct values, F for female and M for male. When a column has a few distinct values, we say that this column has low cardinality.

Oracle has a special kind of index for these types of columns which is called a bitmap index.

A bitmap index is a special kind of database index which uses bitmaps or bit arrays. In a bitmap index, Oracle stores a bitmap for each index key. Each index key stores pointers to multiple rows.

For example, if you create a bitmap index on the gender column of the members table. The structure of the bitmap index looks like the following picture:

It has two separate bitmaps, one for each gender.

Oracle uses a mapping function to convert each bit in the bitmap to the corresponding rowid of the members table.

The syntax for creating a bitmap index is quite simple as follows:

CREATE BITMAP INDEX index_name
ON table_name(column1[,column2,...]);Code language: SQL (Structured Query Language) (sql)

For example, to create a bitmap index for the gender column, you use the following statement:

CREATE BITMAP INDEX members_gender_i
ON members(gender);Code language: SQL (Structured Query Language) (sql)

Now, if you query members by gender, the optimizer will consider using the bitmap index:

EXPLAIN PLAN FOR 
SELECT 
    *
FROM
    members
WHERE
    gender = 'F';

    
SELECT 
    PLAN_TABLE_OUTPUT 
FROM 
    TABLE(DBMS_XPLAN.DISPLAY());
Code language: SQL (Structured Query Language) (sql)

The following picture shows the execution plan:

Oracle Bitmap Index Execution Plan

When to use Oracle bitmap indexes #

Low cardinality columns #

You should use the bitmap index for the columns that have low cardinality. To find the cardinality of a column, you can use the following query:

SELECT column, COUNT(*)
FROM table_name
GROUP BY column;Code language: SQL (Structured Query Language) (sql)

So how low you can go with the bitmap index? A good practice is any column that has less than 100 distinct values.

Infrequently updated or read-only tables #

Maintaining a bitmap index takes a lot of resources, therefore, bitmap indexes are only good for read-only tables or tables that have infrequently updates. Therefore, you often find bitmap indexes are extensively used in the data warehouse environment.

Notice that using a bitmap index for a table that has many single-row updates, especially concurrent single-row updates will cause a deadlock.

The following statement creates a new table named bitmap_index_demo:

CREATE TABLE bitmap_index_demo(
    id INT GENERATED BY DEFAULT AS IDENTITY,
    active NUMBER NOT NULL,
    PRIMARY KEY(id)
);Code language: SQL (Structured Query Language) (sql)

The following statement creates a bitmap index on the active column:

CREATE BITMAP INDEX bitmap_index_demo_active_i
ON bitmap_index_demo(active);Code language: SQL (Structured Query Language) (sql)

Open two sessions and repeatedly execute one of the following statements in each session:

INSERT INTO bitmap_index_demo(active) 
VALUES(1);

INSERT INTO bitmap_index_demo(active) 
VALUES(0);Code language: SQL (Structured Query Language) (sql)

The following error will occur:

ORA-00060: deadlock detected while waiting for resourceCode language: SQL (Structured Query Language) (sql)

In this tutorial, you have learned how to use the Oracle bitmap index to speed up the query.

Was this tutorial helpful?