BITMAP KEY ITERATION

Description

Iterates through bitmaps. Used in star transactions

Versions

This operation is implemented in the following versions

7.3.4
8.0.4
8.0.5
8.0.6
8.1.5
8.1.6
8.1.7
9.0.1
9.2.0
10.1.0
10.2.0

Example

This operation cannot be generated using empty tables. The fact table must contain some rows. In 8.1.5 and above, this can be simulated using DBMS_STATS.SET_TABLE_STATS

This example will only work in 8.1.5 and above because of the modification of the statistics

This example was developed using Oracle 9.2.0.1 on Windows 2000

This example requires the following table and index definitions

    ALTER SESSION SET star_transformation_enabled = TRUE;

    -- Create the fact table
    CREATE TABLE t1 (c1 NUMBER,c2 NUMBER,c3 NUMBER);

    -- Create bitmap indexes on the fact table
    CREATE BITMAP INDEX i1 ON t1 (c1);
    CREATE BITMAP INDEX i2 ON t1 (c2);

    -- Set the number of rows in the fact table
    EXECUTE DBMS_STATS.SET_TABLE_STATS (USER,'T1',numrows=>100000);

    -- Create the dimension tables
    CREATE TABLE t2 (c1 NUMBER,c2 NUMBER);
    CREATE TABLE t3 (c1 NUMBER,c2 NUMBER);

The statement

    SELECT /*+ STAR_TRANSFORMATION */ t1.c01,t2.c02, t3.c02
    FROM t1,t2,t3
    WHERE t2.c01 = t1.c02
    AND t3.c01 = t1.c03
    AND t2.c02 = 0
    AND t3.c02 = 0;

generates the following execution plan

In Oracle 8.1.7

 0      SELECT STATEMENT Optimizer=CHOOSE 
 1    0   HASH JOIN
 2    1     MERGE JOIN (CARTESIAN) 
 3    2       TABLE ACCESS (FULL) OF 'T2'
 4    2       SORT (JOIN)
 5    4         TABLE ACCESS (FULL) OF 'T3'
 6    1     TABLE ACCESS (BY INDEX ROWID) OF 'T1'
 7    6       BITMAP CONVERSION (TO ROWIDS)
 8    7         BITMAP AND
 9    8           BITMAP MERGE
10    9             BITMAP KEY ITERATION
11   10               TABLE ACCESS (FULL) OF 'T2' 
12   10               BITMAP INDEX (RANGE SCAN) OF 'I1'
13    8           BITMAP MERGE
14   13             BITMAP KEY ITERATION
15   14               TABLE ACCESS (FULL) OF 'T3' 
16   14               BITMAP INDEX (RANGE SCAN) OF 'I2'

In Oracle 9.0.1 and 9.2.0

 0      SELECT STATEMENT Optimizer=CHOOSE
 1    0   HASH JOIN
 2    1     MERGE JOIN (CARTESIAN)
 3    2       TABLE ACCESS (FULL) OF 'T2' 
 4    2       BUFFER (SORT)
 5    4         TABLE ACCESS (FULL) OF 'T3' 
 6    1     TABLE ACCESS (BY INDEX ROWID) OF 'T1'
 7    6       BITMAP CONVERSION (TO ROWIDS)
 8    7         BITMAP AND
 9    8           BITMAP MERGE
10    9             BITMAP KEY ITERATION
11   10               TABLE ACCESS (FULL) OF 'T2'
12   10               BITMAP INDEX (RANGE SCAN) OF 'I1'
13    8           BITMAP MERGE
14   13             BITMAP KEY ITERATION
15   14               TABLE ACCESS (FULL) OF 'T3'
16   14               BITMAP INDEX (RANGE SCAN) OF 'I2'

Not yet tested in Oracle 10.1.0

In Oracle 10.2.0

   0      SELECT STATEMENT Optimizer=CHOOSE
   1    0   HASH JOIN
   2    1     HASH JOIN
   3    2       TABLE ACCESS (FULL) OF 'T2' 
   4    2       TABLE ACCESS (BY INDEX ROWID) OF 'T1'
   5    4         BITMAP CONVERSION (TO ROWIDS)
   6    5           BITMAP AND
   7    6             BITMAP MERGE
   8    7               BITMAP KEY ITERATION
   9    8                 TABLE ACCESS (FULL) OF 'T2'
  10    8                 BITMAP INDEX (RANGE SCAN) OF 'I1'
  11    6             BITMAP MERGE
  12   11               BITMAP KEY ITERATION
  13   12                 TABLE ACCESS (FULL) OF 'T3'
  14   12                 BITMAP INDEX (RANGE SCAN) OF 'I2'
  15    1     TABLE ACCESS (FULL) OF 'T3'