用示例说明B-Tree索引性能优于BitMap索引

一、实验说明:

     操作系统:rhel 5.4 x86

     数据库:Oracle 11g R2

     实验说明:该实验是为了说明B-Tree索引性能优于BitMap索引的情况。

 

二、实验操作:

  首先创建一张t_btree表,并建立B-Tree索引,索引键是object_id:

1 SQL> create table t_btree as select * from dba_objects;
2 
3 Table created.
4 
5 SQL> create index ind_tree on t_btree(object_id);
6 
7 Index created.

  执行两次下面的查询语句,并显示执行计划:

 1 SQL> set autotrace traceonly;
 2 SQL> select * from t_btree where object_id=9899;
 3 
 4 
 5 Execution Plan
 6 ----------------------------------------------------------
 7 Plan hash value: 447474086
 8 
 9 ----------------------------------------------------------------------------------------
10 | Id  | Operation            | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
11 ----------------------------------------------------------------------------------------
12 |   0 | SELECT STATEMENT        |           |     1 |   207 |     2     (0)| 00:00:01 |
13 |   1 |  TABLE ACCESS BY INDEX ROWID| T_BTREE  |     1 |   207 |     2     (0)| 00:00:01 |
14 |*  2 |   INDEX RANGE SCAN        | IND_TREE |     1 |       |     1     (0)| 00:00:01 |
15 ----------------------------------------------------------------------------------------
16 
17 Predicate Information (identified by operation id):
18 ---------------------------------------------------
19 
20    2 - access("OBJECT_ID"=9899)
21 
22 Note
23 -----
24    - dynamic sampling used for this statement (level=2)
25 
26 
27 Statistics
28 ----------------------------------------------------------
29     312  recursive calls
30       0  db block gets
31     108  consistent gets
32     289  physical reads
33       0  redo size
34    1404  bytes sent via SQL*Net to client
35     419  bytes received via SQL*Net from client
36       2  SQL*Net roundtrips to/from client
37       0  sorts (memory)
38       0  sorts (disk)
39       1  rows processed
40 
41 SQL> select * from t_btree where object_id=9899;
42 
43 
44 Execution Plan
45 ----------------------------------------------------------
46 Plan hash value: 447474086
47 
48 ----------------------------------------------------------------------------------------
49 | Id  | Operation            | Name     | Rows  | Bytes | Cost (%CPU)| Time     |
50 ----------------------------------------------------------------------------------------
51 |   0 | SELECT STATEMENT        |           |     1 |   207 |     2     (0)| 00:00:01 |
52 |   1 |  TABLE ACCESS BY INDEX ROWID| T_BTREE  |     1 |   207 |     2     (0)| 00:00:01 |
53 |*  2 |   INDEX RANGE SCAN        | IND_TREE |     1 |       |     1     (0)| 00:00:01 |
54 ----------------------------------------------------------------------------------------
55 
56 Predicate Information (identified by operation id):
57 ---------------------------------------------------
58 
59    2 - access("OBJECT_ID"=9899)
60 
61 Note
62 -----
63    - dynamic sampling used for this statement (level=2)
64 
65 
66 Statistics
67 ----------------------------------------------------------
68       0  recursive calls
69       0  db block gets
70       4  consistent gets
71       0  physical reads
72       0  redo size
73    1404  bytes sent via SQL*Net to client
74     419  bytes received via SQL*Net from client
75       2  SQL*Net roundtrips to/from client
76       0  sorts (memory)
77       0  sorts (disk)
78       1  rows processed

  接着创建跟t_btree一样的表t_bmap,并创建BitMap索引。

1 SQL> create table t_bmap as select * from dba_objects;
2 
3 Table created.
4 
5 SQL> create bitmap index ind_map on t_bmap(object_id);
6 
7 Index created.

  同样执行之前的语句两次:

 1 SQL>  select * from t_bmap where object_id=9899; 
 2 
 3 
 4 Execution Plan
 5 ----------------------------------------------------------
 6 Plan hash value: 3763176822
 7 
 8 ----------------------------------------------------------------------------------------
 9 | Id  | Operation             | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
10 ----------------------------------------------------------------------------------------
11 |   0 | SELECT STATEMENT         |           |     1 |   207 |   110     (0)| 00:00:02 |
12 |   1 |  TABLE ACCESS BY INDEX ROWID | T_BMAP  |     1 |   207 |   110     (0)| 00:00:02 |
13 |   2 |   BITMAP CONVERSION TO ROWIDS|           |       |       |        |           |
14 |*  3 |    BITMAP INDEX SINGLE VALUE | IND_MAP |       |       |        |           |
15 ----------------------------------------------------------------------------------------
16 
17 Predicate Information (identified by operation id):
18 ---------------------------------------------------
19 
20    3 - access("OBJECT_ID"=9899)
21 
22 Note
23 -----
24    - dynamic sampling used for this statement (level=2)
25 
26 
27 Statistics
28 ----------------------------------------------------------
29     312  recursive calls
30       0  db block gets
31      98  consistent gets
32     266  physical reads
33       0  redo size
34    1404  bytes sent via SQL*Net to client
35     419  bytes received via SQL*Net from client
36       2  SQL*Net roundtrips to/from client
37       0  sorts (memory)
38       0  sorts (disk)
39       1  rows processed
40 
41 SQL> select * from t_bmap where object_id=9899; 
42 
43 
44 Execution Plan
45 ----------------------------------------------------------
46 Plan hash value: 3763176822
47 
48 ----------------------------------------------------------------------------------------
49 | Id  | Operation             | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
50 ----------------------------------------------------------------------------------------
51 |   0 | SELECT STATEMENT         |           |     1 |   207 |   110     (0)| 00:00:02 |
52 |   1 |  TABLE ACCESS BY INDEX ROWID | T_BMAP  |     1 |   207 |   110     (0)| 00:00:02 |
53 |   2 |   BITMAP CONVERSION TO ROWIDS|           |       |       |        |           |
54 |*  3 |    BITMAP INDEX SINGLE VALUE | IND_MAP |       |       |        |           |
55 ----------------------------------------------------------------------------------------
56 
57 Predicate Information (identified by operation id):
58 ---------------------------------------------------
59 
60    3 - access("OBJECT_ID"=9899)
61 
62 Note
63 -----
64    - dynamic sampling used for this statement (level=2)
65 
66 
67 Statistics
68 ----------------------------------------------------------
69       7  recursive calls
70       0  db block gets
71      68  consistent gets
72       0  physical reads
73       0  redo size
74    1404  bytes sent via SQL*Net to client
75     419  bytes received via SQL*Net from client
76       2  SQL*Net roundtrips to/from client
77       0  sorts (memory)
78       0  sorts (disk)
79       1  rows processed

   从上面的查询中,我们可以得到,分别给两张内容一样的表做查询的时候,在执行第二次的时候是属于软解析:

   从一致性读上比较,B-Tree索引的consistent gets是4,BitMap的是68;

   从Cost的消耗上看,B-Tree索引的COST是2,而BitMap的是110。

   在索引键是主键或者唯一性约束的情况下B-Tree索引的效率要优于BitMap索引。

 

posted @ 2012-12-24 14:07  I’m Me!  阅读(1173)  评论(0编辑  收藏  举报