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:

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.