凤凰彩票app 位图索引

日期:2021-03-09 18:35:26 浏览量: 81

今天的位图索引是2014-01-15,继续学习索引技术凤凰彩票app ,今天的学习内容是位图索引;位图索引指南:1、通用位图索引用于相对较小的基数列中列2、最适合用于数据仓库,而dss系统3、最适合用于星型模式4、索引列的许多链接查询或过滤器查询

位图索引

今天是2014年1月15日,继续学习索引技术,今天的学习内容是位图索引;

使用位图索引的指南:

1、通用位图索引用于基数相对较小的列中

2、最适合用于数据仓库和dss系统

3、最好在星空模式下使用

4、位图索引在索引列上有许多链接查询或筛选查询的情况下具有很高的性能。

5、 dml操作不完全支持位图索引。建议在执行dml操作时删除位图索引,然后再进行重建(这同样适用于在分区上创建的位图索引)

位图索引创建:

在nologging的table_name(table_column_name)上创建位图索引index_name;

请注意,由于位图索引对dml语句的支持较差im体育平台 ,因此需要使用nologging操作。

此外,位图索引不像B树索引那样存储空值。 B树索引不存储单列字段的空值。对于多列字段,其中一个不为null,另一列为null。索引存储空值。因此,如果B树索引列上存在null,则可能不会采用该索引,但是位图索引却不会像这样,因为它实际上存储了null值。

测试如下:

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)
          1  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)
          1  rows processed
SQL> 

分区表和位图索引:

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

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,如果没有则可以添加映射表,在进行创建位图索引:

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,
  6  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> 

此外,在使用星形模式时,位图索引可以提高高性能,但是必须在中央事实表的外键列上创建位图索引凤凰体育平台yabo娱乐 ,并且需要配置star转换参数(例如star_transformation_enabled) 。 ;

如果没有星形转换位图索引 在线重建,则可以强制添加提示,例如:/ * + star_transformation * / / ** star_transformation fact(column_name)* /

在一开始,还提到位图索引不利于dml语句支持,因此在执行dml操作时,位图索引在重建之前需要不可用。对于分区位图索引,必须为每个分区重建位图索引;

例如:alter index xxxx修改分区ppppppp无法使用;更改索引xxxx重建分区ppppppp;或重建分区上的所有索引:alter table xxx修改分区xxxx重建不可用的本地索引;

位图索引中还有一个位图连接索引

位图联接索引适用于星型模式亚博集团 ,它是大型事实表和维度表之间的联接列的实体化联接。在创建连接索引期间,连接位置操作已经完成位图索引 在线重建,并且连接的结果也存在。在连接索引中,连接查询速度会更高:

创建实例如下

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中文网最新课程二维码