首页 > 数据库 > mysql教程 > 位图索引

位图索引

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
发布: 2016-06-07 15:28:08
原创
2611 人浏览过

位图索引 今天是2014-01-15,继续进行索引的相关技术学习,今天学习内容为位图索引; 位图索引使用指南: 1、一般位图索引使用在基数列比较小的列 2、最好用于数据仓库和dss系统 3、最好用于星型模式 4、对于在索引列上有很多链接查询或是过滤查询的情况,位

位图索引 

今天是2014-01-15,继续进行索引的相关技术学习,今天学习内容为位图索引;
位图索引使用指南:
1、一般位图索引使用在基数列比较小的列
2、最好用于数据仓库和dss系统
3、最好用于星型模式
4、对于在索引列上有很多链接查询或是过滤查询的情况,位图索引有很高的性能
5、位图索引对dml操作支持性不好,建议在进行dml操作时删掉位图索引,之后再重建(同样适用于在分区上建立的位图索引)
位图索引创建:
create bitmap index index_name on table_name(table_column_name) nologging;
注意因为位图索引对dml语句支持性不好需要使用nologging操作。
另外位图索引不像B树索引一样不存储null值。B树索引对于单列字段是不存储null值的,对于多列字段其中一例不为null,另一列为null的索引是存储null值的。因此在B树索引列上如果存在null可能出现不走索引的情况,但是位图索引不会这样,因为它实际存储null值。
测试如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

SQL> conn amy/rhys

Connected.

SQL> select index_name,column_name,column_position,table_name from user_ind_columns where table_name='EMP';

 

INDEX_NAME                     COLUMN_NAME          COLUMN_POSITION TABLE_NAME

------------------------------ -------------------- --------------- ------------------------------

EMP_BTIDX1                     ENAME                              1 EMP

 

SQL> drop index emp_btidx1;

 

Index dropped.

 

SQL> select * from emp;

 

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

      7369 SMITH      CLERK           7902 17-DEC-80        800                    20

      7499 ALLEN      SALESMAN        7698 20-FEB-81       1600        300         30

      7521 WARD       SALESMAN        7698 22-FEB-81       1250        500         30

      7566 JONES      MANAGER         7839 02-APR-81       2975                    20

      7654 MARTIN     SALESMAN        7698 28-SEP-81       1250       1400         30

      7698 BLAKE      MANAGER         7839 01-MAY-81       2850                    30

      7782 CLARK      MANAGER         7839 09-JUN-81       2450                    10

      7788 SCOTT      ANALYST         7566 19-APR-87       3000                    20

      7839 KING       PRESIDENT            17-NOV-81       5000                    10

      7844 TURNER     SALESMAN        7698 08-SEP-81       1500          0         30

      7876 ADAMS      CLERK           7788 23-MAY-87       1100                    20

 

     EMPNO ENAME      JOB              MGR HIREDATE         SAL       COMM     DEPTNO

---------- ---------- --------- ---------- --------- ---------- ---------- ----------

      7900 JAMES      CLERK           7698 03-DEC-81        950                    30

      7902 FORD       ANALYST         7566 03-DEC-81       3000                    20

      7934 MILLER     CLERK           7782 23-JAN-82       1300                    10

      9888            xiaohai

 

15 rows selected.

 

 

SQL>  create index emp_idx1 on emp(ename);

 

Index created.

 

SQL> set autotrace trace

 

SQL> select * from emp where ename is null;

 

 

Execution Plan

----------------------------------------------------------

Plan hash value: 3956160932

 

--------------------------------------------------------------------------

| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |

--------------------------------------------------------------------------

|   0 | SELECT STATEMENT  |      |     1 |    37 |     6   (0)| 00:00:01 |

|*  1 |  TABLE ACCESS FULL| EMP  |     1 |    37 |     6   (0)| 00:00:01 |

--------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   1 - filter("ENAME" IS NULL)

 

 

Statistics

----------------------------------------------------------

          1  recursive calls

          0  db block gets

         18  consistent gets

          0  physical reads

          0  redo size

       1004  bytes sent via SQL*Net to client

        523  bytes received via SQL*Net from client

          2  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          rows processed

SQL> set autotrace off

 

SQL> drop index emp_idx1;

 

Index dropped.

 

SQL> create bitmap index emp_btidx1 on emp(ename);

 

Index created.

 

 

SQL> set autotrace trace 

 

SQL> select * from emp where ename is null;

 

 

Execution Plan

----------------------------------------------------------

Plan hash value: 448664046

 

-------------------------------------------------------------------------------------------

| Id  | Operation                    | Name       | Rows  | Bytes | Cost (%CPU)| Time     |

-------------------------------------------------------------------------------------------

|   0 | SELECT STATEMENT             |            |     1 |    37 |     3   (0)| 00:00:01 |

|   1 |  TABLE ACCESS BY INDEX ROWID | EMP        |     1 |    37 |     3   (0)| 00:00:01 |

|   2 |   BITMAP CONVERSION TO ROWIDS|            |       |       |            |          |

|*  3 |    BITMAP INDEX SINGLE VALUE | EMP_BTIDX1 |       |       |            |          |

-------------------------------------------------------------------------------------------

 

Predicate Information (identified by operation id):

---------------------------------------------------

 

   3 - access("ENAME" IS NULL)

 

 

Statistics

----------------------------------------------------------

          1  recursive calls

          0  db block gets

          2  consistent gets

          0  physical reads

          0  redo size

       1003  bytes sent via SQL*Net to client

        523  bytes received via SQL*Net from client

          2  SQL*Net roundtrips to/from client

          0  sorts (memory)

          0  sorts (disk)

          rows processed

 

SQL>

登录后复制

分区表与位图索引:

位图索引只能在分区表上创建本地索引,不能创建全局索引:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

SQL> create bitmap index achivement_btidx1 on achivement(id);

create bitmap index achivement_btidx1 on achivement(id)

                                         *

ERROR at line 1:

ORA-25122: Only LOCAL bitmap indexes are permitted on partitioned tables

 

 

SQL> create bitmap index achivement_btidx1 on achivement(id) local nologging;

 

Index created.

 

SQL> drop index achivement_btidx1;

 

Index dropped.

 

SQL> create bitmap index achivement_btidx1 on achivement(id) global;

create bitmap index achivement_btidx1 on achivement(id) global

                                                        *

ERROR at line 1:

ORA-25113: GLOBAL may not be used with a bitmap index

 

 

SQL>

索引组织表与位图索引:

在索引组织表上创建二级位图索引必须指定映射表mapping table,如果没有则可以添加映射表,在进行创建位图索引:

登录后复制

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

SQL>

SQL>

SQL>

SQL> create table emp_list(

  2  emp_id number(6) not null,

  3  first_name varchar2(20)

  4  ,last_name varchar2(20),

  5  email varchar2(25) not null,

  constraint emp_list_pk primary key (emp_id,first_name)

  7  )

  8  organization index

  9  mapping table;

 

Table created.

 

SQL> create bitmap index emp_list_btidx1 on emp_list(email) nologging;

 

Index created.

 

SQL> drop index emp_list_btidx1;

 

Index dropped.

 

SQL> alter table emp_list move nomapping;

 

Table altered.

 

SQL> create bitmap index emp_list_btidx1 on emp_list(email) nologging;

create bitmap index emp_list_btidx1 on emp_list(email) nologging

                                       *

ERROR at line 1:

ORA-28669: bitmap index can not be created on an IOT with no mapping table

 

 

SQL> alter table emp_list move mapping table;

 

Table altered.

 

 

SQL> create bitmap index emp_list_btidx1 on emp_list(email) nologging;

 

Index created.

 

SQL>

登录后复制

另外在使用星型模式时,位图索引可以提高很高的性能,但是在中心事实表的外键列上必须创建位图索引,另外还需要配置星型转换参数如:star_transformation_enabled 为true;
如果没有走星型转换可以强制添加hint(提示)如:/*+star_transformation*/ /*+star_transformation fact(column_name)*/
在 开始也提到位图索引对dml语句支持性不好,因此在搞的dml操作的时候需要对位图索引进行unusable之后再重建。对于分区位图索引需要对每个分区进行位图索引重建;
如:alter index xxxx modify partition ppppppp unusable; alter index xxxx rebuild partition ppppppp;或是对分区上所有索引重建:alter table xxx modify partition xxxx rebuild unusable local indexes;

另外对于位图索引还有一个位图连接索引
位图连接索引适合与星型模式,就是一个大的事实表与维度表之间的连接列的物化连接,在创建连接索引过程中就已经完成了连接位置操作,连接的结果也存在于连接索引中,因此连接查询速度会更高:
创建实例如下

1

2

3

4

5

6

7

8

9

create bitmap index emp_bjix01

on xxx(a.ssss,b.dddd)

from www a,zzz b

where a.pp=b.pp

tablespace mmmmm

pctfree 5

parallel 4

local

nologging;

登录后复制


对于位图索引查看信息可以查看dba_indexes 和 dba_join_ind_columns两个视图获得相关信息。

相关标签:
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板