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.

Quiz #

Was this tutorial helpful?