你的位置:首页 > 软件开发 > 数据库 > Oracle索引总结(四)

Oracle索引总结(四)

发布时间:2016-10-03 00:00:12
位图索引1.1 位图索引概述位图索引通过位图向量,表示索引键值在表中的分布。适用于没有大量更新操作的对象,如:OLAP数据库。对于存在大量更新操作的索引列,不适用位图索引。因此对于OLTP并不适用。更新位图向量时,相应位图涉及的所有数据行会被锁定,无法针对这些数据行的该索引列进行 ...

位图索引

1.1 位图索引概述

  • 位图索引通过位图向量,表示索引键值在表中的分布。
  • 适用于没有大量更新操作的对象,如:OLAP数据库
  • 对于存在大量更新操作的索引列,不适用位图索引。因此对于OLTP并不适用。
    • 更新位图向量时,相应位图涉及的所有数据行会被锁定,无法针对这些数据行的该索引列进行DML操作

 

1.2 位图索引结构的说明

Oracle索引总结(四)

 

与B-tree索引的联系及区别如下:

  • 与B-tree索引的联系:位图索引使用B-tree形式组成。
  • 与B-tree索引的区别:位图索引的一个索引键值对应一个叶子节点。(B-tree的叶节点包含多个索引键值)
  • 与B-tree索引的区别:位图索引使用位图向量标识键值对应的数据行分布情况。(B-tree采用rowid定位数据行)

 

此外:

  • 位图索引创建时,不需要进行排序,因此速度较快;而B-tree索引创建时,需要排序等操作,因此慢很多。
  • 位图索引允许键值为NULL,因此进行NULL条件查询时,可以使用索引。而B-tree索引不记录NULL(组合索引除外),因此会使用全表扫描。
  • 对于表的访问效率很高
    • 当使用count(XX),可以直接访问索引就快速得出统计数据.-- 查看表的总行数Yumiko@sunny >select count(*) from test01; COUNT(*)---------- 22928--建立b-tree索引并验证Yumiko@sunny >create index BTREE_OWNER on test01(owner);Index created.-- 查询owner字段为SYS时,由于数据中该字段的数据存在明显的数据倾斜,若通过索引方式检索,将先扫面大部分的索引块,然后再根据rowid查找数据块,此时代价十分大,不如直接全表扫描效率高,因此不用索引。-- 删除B-tree索引,创建位图索引并查看Yumiko@sunny >create bitmap index bitmap_owner on test01(owner);Index created.Yumiko@sunny >select INDEX_NAME,INDEX_TYPE,TABLE_NAME from user_indexes where TABLE_NAME = 'TEST01';INDEX_NAME INDEX_TYPE TABLE_NAME------------------------------ --------------------------- ------------------------------BITMAP_OWNER BITMAP TEST01-- 当查看owner为BI时,与b-tree一样,使用索引扫描的方式进行检索。Yumiko@sunny >select * from test01 where owner='BI';8 rows selected.Execution Plan----------------------------------------------------------Plan hash value: 3098739824---------------------------------------------------------------------------------------------| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |---------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 8 | 1416 | 55 (0)| 00:00:01 || 1 | TABLE ACCESS BY INDEX ROWID | TEST01 | 8 | 1416 | 55 (0)| 00:00:01 || 2 | BITMAP CONVERSION TO ROWIDS| | | | | ||* 3 | BITMAP INDEX SINGLE VALUE | BITMAP_OWNER | | | | |---------------------------------------------------------------------------------------------Predicate Information (identified by operation id):--------------------------------------------------- 3 - access("OWNER"='BI')Note----- - dynamic sampling used for this statementStatistics---------------------------------------------------------- 40 recursive calls 0 db block gets 82 consistent gets 0 physical reads 0 redo size 2010 bytes sent via SQL*Net to client 469 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 8 rows processed--查看表的前三行数据Yumiko@sunny01 >select OWNER,OBJECT_ID,DATA_OBJECT_ID,OBJECT_TYPE from test01 where rownum < 4;OWNER OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE------------------------------ ---------- -------------- -------------------SYS 20 2 TABLESYS 44 44 INDEXSYS 28 28 TABLE--发起事务2对于位图索引列owner为SYS值的另一行数据库的owner字段的更新操作,此时事务停顿。Yumiko@sunny02 >update test01 set OWNER='BI' where DATA_OBJECT_ID=44;--查看此时会话的事件,发现有row lock等待事件Yumiko@sunny >select SID,USERNAME,PROGRAM,EVENT from v$session where username='SCOTT'; SID USERNAME PROGRAM EVENT--------- ------------------------------ ------------------------------------------------ 147 SCOTT sqlplus@OA01 (TNS V1-V3) enq: TX - row lock contention 153 SCOTT sqlplus@OA01 (TNS V1-V3) SQL*Net message from client

      原标题:Oracle索引总结(四)

      关键词:oracle

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录