Oracle 优化——位图、等索引介绍

一、位图索引

我将使用一个例子,来描述位图索引的存储,并分析它的优点。

Table :Loans 放贷信息

ID userId 行业投向 币种 证件类型 还本付息方式 状态
1 1 农业 人民币 身份证 等额本息还款法 已上报
2 2 农业 人民币 身份证 等本还款法 未上报
3 1 工业 人民币 护照 按季计息到期还本法 已上报
4 2 个体 人民币 身份证 等本还款法 已上报
5 5 其他 人民币 身份证 按月计息到期还本法 未上报

我对行业投向,和还本付息方式添加了位图索引

create bitmap index index_投向 on loans(行业投向);
create bitmap index index_还本付息方式 on loans(还本付息方式);

那么它会这么对位图索引进行存储:当前列的每一种值,存放在一个块中,通过0和1来标示改rownumber是否存在改值。

行业投向位图索引/还本付息方式  

值/行 第一行 第二行 第三行 第四行
农业  1  1  0  0
工业  0  0  1  0
个体  0  0  0  1
其他  0  0  0  0
值/行 第一行 第二行 第三行 第四行
等额本息还款法  1  0  0  0
等本还款法  0  1  0  0
按季计息到期还本法  0  0  1  0
按月计息到期还本法  0  0  0 1

有图可以看出, 农业、工业、个体都各以一个块来存放 所有列“自己是否为真”。

所以暂时可以得出:

1、位图索引,必须创建在“仅仅几种值的情况”。

  如果在低重复度的列上创建位图索引是很恐怖的,他将创建N多个块来存储。不论创建,还是查询,都是不聪明的。

2、位图索引,不适合放在常修改的字段列(如状态列)容易发生死锁。

  位图索引死锁情况举例

--SESSION 1(持有者)
DELETE FROM LOANS WHERE 行业投向=‘农业‘ AND status=1;

---SESSION 2(其他会话) 插入带‘农业‘的记录就立即被阻挡,以下三条语句都会被阻止
insert into loans(Id,投向.....) values (1,‘农业‘,....);
update t set 投向=‘工业‘ WHERE id=25;
delete from loans WHERE 行业投向=‘农业‘;

--以下是可以进行不受阻碍的
insert into loans(Id,投向.....) values (1,‘工业‘,....);
delete from t where gender=‘工业‘ ;
UPDATE T SET status=‘aa‘ WHERE ROWID NOT IN ( SELECT ROWID FROM T WHERE 投向=‘工业‘ ) ; 

--update只要不更新位图索引所在的列即可

3、索引通过 比特位 存储01,来标示真假,占用内存很小,检索效率极高。

  count(*) where 行业投向 = 农业,效率是很高的,

当采集平台完成这些金融数据采集后,金融监管部门要对信息进行分析、统计,形成报表。有位图索引效率是很好的。

具体案例

  1 /*
  2 总结:本质原因:其实就是位图索引存放的是0,1的比特位,占字节数特别少。
  3 */
  4
  5 --位图索引跟踪前准备
  6 drop table t purge;
  7 set autotrace off
  8 create table t as select * from dba_objects;
  9 insert into t select * from t;
 10 insert into t select * from t;
 11 insert into t select * from t;
 12 insert into t select * from t;
 13 insert into t select * from t;
 14 insert into t select * from t;
 15 update t set object_id=rownum;
 16 commit;
 17
 18 --观察COUNT(*)全表扫描的代价
 19 set autotrace on
 20 set linesize 1000
 21 select count(*) from t;
 22
 23
 24
 25 ------------------------------------------
 26   COUNT(*)
 27 ----------
 28   4684992
 29 执行计划
 30 ----------------------------------------------------------
 31 Plan hash value: 2966233522
 32
 33 -------------------------------------------------------------------
 34 | Id  | Operation          | Name | Rows  | Cost (%CPU)| Time     |
 35 -------------------------------------------------------------------
 36 |   0 | SELECT STATEMENT   |      |     1 | 20420  (11)| 00:04:06 |
 37 |   1 |  SORT AGGREGATE    |      |     1 |            |          |
 38 |   2 |   TABLE ACCESS FULL| T    |   294M| 20420  (11)| 00:04:06 |
 39 -------------------------------------------------------------------
 40 统计信息
 41 ----------------------------------------------------------
 42           0  recursive calls
 43           0  db block gets
 44       66731  consistent gets
 45           0  physical reads
 46           0  redo size
 47         426  bytes sent via SQL*Net to client
 48         415  bytes received via SQL*Net from client
 49           2  SQL*Net roundtrips to/from client
 50           0  sorts (memory)
 51           0  sorts (disk)
 52           1  rows processed
 53
 54
 55
 56
 57
 58 --观察COUNT(*)用普通索引的代价
 59 create index idx_t_obj on t(object_id);
 60 alter table T modify object_id not null;
 61 set autotrace on
 62 select count(*) from t;
 63
 64
 65
 66
 67
 68   COUNT(*)
 69 ----------
 70   4684992
 71 普通索引的执行计划
 72 ---------------------------------------------------------------------------
 73 | Id  | Operation             | Name      | Rows  | Cost (%CPU)| Time     |
 74 ---------------------------------------------------------------------------
 75 |   0 | SELECT STATEMENT      |           |     1 |  3047   (2)| 00:00:37 |
 76 |   1 |  SORT AGGREGATE       |           |     1 |            |          |
 77 |   2 |   INDEX FAST FULL SCAN| IDX_T_OBJ |  4620K|  3047   (2)| 00:00:37 |
 78 ---------------------------------------------------------------------------
 79 普通索引的统计信息
 80 ----------------------------------------------------------
 81           0  recursive calls
 82           0  db block gets
 83       10998  consistent gets
 84           0  physical reads
 85           0  redo size
 86         426  bytes sent via SQL*Net to client
 87         415  bytes received via SQL*Net from client
 88           2  SQL*Net roundtrips to/from client
 89           0  sorts (memory)
 90           0  sorts (disk)
 91           1  rows processed
 92
 93
 94
 95
 96 --观察COUNT(*)用位图索引的代价(注意,这里我们特意取了status这个重复度很高的列做索引)
 97 create bitmap index idx_bitm_t_status on t(status);
 98 select count(*) from t;
 99
100 SQL> select count(*) from t;
101
102
103
104
105
106
107   COUNT(*)
108 ----------
109   4684992
110
111 位图索引的执行计划
112 -------------------------------------------------------------------------------------------
113 | Id  | Operation                     | Name              | Rows  | Cost (%CPU)| Time     |
114 -------------------------------------------------------------------------------------------
115 |   0 | SELECT STATEMENT              |                   |     1 |   115   (0)| 00:00:02 |
116 |   1 |  SORT AGGREGATE               |                   |     1 |            |          |
117 |   2 |   BITMAP CONVERSION COUNT     |                   |  4620K|   115   (0)| 00:00:02 |
118 |   3 |    BITMAP INDEX FAST FULL SCAN| IDX_BITM_T_STATUS |       |            |          |
119 -------------------------------------------------------------------------------------------
120 位图索引的统计信息
121 ----------------------------------------------------------
122           0  recursive calls
123           0  db block gets
124         125  consistent gets
125           0  physical reads
126           0  redo size
127         426  bytes sent via SQL*Net to client
128         415  bytes received via SQL*Net from client
129           2  SQL*Net roundtrips to/from client
130           0  sorts (memory)
131           0  sorts (disk)
132           1  rows processed
133
134  

位图索引与普通索引比较以及执行计划

4、

二、反向索引

三、函数索引

四、全文检索

时间: 2024-07-29 00:47:52

Oracle 优化——位图、等索引介绍的相关文章

Oracle优化经典文章------索引原理篇

Oracle提供了大量索引选项.知道在给定条件下使用哪个选项对于一个应用程序的性能来说非常重要.一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程终止.而如果做出正确的选择,则可以合理使用资源,使那些已经运行了几个小时甚至几天的进程在几分钟得以完成,这样会使您立刻成为一位英雄.这篇文章就将简单的讨论每个索引选项.主要有以下内容:    [1] 基本的索引概念    查询DBA_INDEXES视图可得到表中所有索引的列表,注意只能通过USER_INDEXES的方法来检索模式(schema

SQL Server和Oracle数据库索引介绍

SQL Server和Oracle数据库索引介绍 1 SQL Server中的索引 索引是与表或视图关联的磁盘上结构,可以加快从表或视图中检索行的速度.索引包含由表或视图中的一列或多列生成的键.这些键存储在一个结构(B 树)中,使 SQL Server 可以快速有效地查找与键值关联的行. 表或视图可以包含以下类型的索引: 聚集索引 聚集索引根据数据行的键值在表或视图中排序和存储这些数据行.索引定义中包含聚集索引列.每个表只能有一个聚集索引,因为数据行本身只能按一个顺序排序. 只有当表包含聚集索引

ORACLE优化器RBO与CBO介绍总结

RBO和CBO的基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基于规则的优化器(RBO)与基于代价的优化器(CBO) RBO: Rule-Based Optimization 基于规则的优化器 CBO: Cost-Based Optimization 基于代价的优化器 RBO自ORACLE 6以来被采用,一直沿用至ORACLE 9i. ORACLE 10g开始,

Oracle优化器三大种类的介绍

Oracle优化器一共有三种即,RULE (基于规则),COST (基于成本)以及CHOOSE (选择性),我们大家都知道设置缺省的相关Oracle优化器,其可以通过对init.ora文件中OPTIMIZER_MODE参数的各种声明. 如RULE,COST,CHOOSE,ALL_ROWS,FIRST_ROWS . 你当然也在SQL句级或是会话(session)级对其进行覆盖. 为了使用基于成本的优化器(CBO, Cost-Based Optimizer) , 你必须经常运行analyze 命令,

数据库索引介绍及使用【转】

数据库索引介绍及使用 一.索引的概念 索引就是加快检索表中数据的方法.数据库的索引类似于书籍的索引.在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息.在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库. 二.索引的特点 1.索引可以加快数据库的检索速度 2.索引降低了数据库插入.修改.删除等维护任务的速度 3.索引创建在表上,不能创建在视图上 4.索引既可以直接创建,也可以间接创建 5.可以在优化隐藏中,使用索引 6.使用查询处理器执行SQL语句,在一个表

复合索引介绍

什么是复合索引 1.1           复合索引定义 索引可以包含一个.两个或更多个列.两个或更多个列上的索引被称作复合索引. 利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引不同于使用两个单独的索引.复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序.如果您知道姓,电话簿将非常有用:如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处. 所以说创建复合索引时,应该仔细考虑列的顺序.对索引中的所

【Oracle 优化】Oracle数据库提高命中率及相关优化

本文是关于Oracle数据库调试与优化方面的文章,主要介绍Oracle数据库中命中率相关的问题,包括不同的算法之间性能的比对. 关于Oracle中各个命中率的计算以及相关的调优 1)Library Cache的命中率: .计算公式:Library Cache Hit Ratio = sum(pinhits) / sum(pins) SQL>SELECT SUM(pinhits)/sum(pins) FROM V$LIBRARYCACHE; 通常在98%以上,否则,需要要考虑加大共享池,绑定变量,

Oracle 优化和性能调整

分析评价Oracle数据库性能主要有数据库吞吐量.数据库用户响应时间两项指标.数据库用户响应时间又可以分为系统服务时间和用户等待时间两项,即:  数据库用户响应时间=系统服务时间+用户等待时间  因此,获得满意的用户响应时间有两个途径:一是减少系统服务时间,即提高数据库的吞吐量:二是减少用户等待时间,即减少用户访问同一数据库资源的冲突率.  数据库性能优化包括如下几个部分:  调整数据结构的设计 这一部分在开发信息系统之前完成,程序员需要考虑是否使用Oracle数据库的分区功能,对于经常访问的数

【三思笔记】 全面学习Oracle分区表及分区索引

[三思笔记]全面学习Oracle分区表及分区索引 2008-04-15 关于分区表和分区索引(About PartitionedTables and Indexes) 对于 10gR2 而言,基本上可以分成几类: v  Range(范围)分区 v  Hash(哈希)分区 v  List(列表)分区 v  以及组合分区:Range-Hash,Range-List. 对于表而言(常规意义上的堆组织表),上述分区形式都可以应用(甚至可以对某个分区指定 compress 属性),只不过分区依赖列不能是