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 resource
Code language: SQL (Structured Query Language) (sql)
In this tutorial, you have learned how to use the Oracle bitmap index to speed up the query.