Oracle数据库的位图索引原理与应用

2021-11-03 13:39李爱武
现代信息科技 2021年8期
关键词:Oracle数据库

DOI:10.19850/j.cnki.2096-4706.2021.08.045

摘  要:指出了执行查询优化时,效果最显著的方法是使用B树索引,给出了使用B树索引的限制条件,分析了位图索引不同于B树索引的主要特点,以实例验证了位图索引存储的内容,得出了位图索引的结构。设计简洁的实验步骤,验证了使用位图索引对查询速度的提高幅度,以实例给出了位图索引所占空间的大小,最后给出了不适合使用位图索引的情况。

关键词:Oracle数据库;位图索引;查询优化

中图分类号:TP311.13      文献标识码:A 文章编号:2096-4706(2021)08-0159-03

Principle and Application of Bitmap Index in Oracle Database

LI Aiwu

(Guangdong Vocational College of Post and Telecom,Guangzhou  510630,China)

Abstract:It is pointed out that the most effective way to perform query optimization is to use B-tree index,and the restrictions of using B-tree index are given. The main features of bitmap index that are different from B-tree index are analyzed,and the storage content of bitmap indexes is verified by examples,and obtains the structure of bitmap index. A concise experimental procedure is designed to verify the magnitude of improvement in query speed by using bitmap index. The size of space occupied by bitmap index is given with examples,and finally,the cases in which the use of bitmap indexes is not suitable are given.

Keywords:Oracle database;bitmap index;query optimization

0  引  言

使用B树索引要求索引列值的重复率要很低,但在实际应用中,列值重复率高的情况是很常见的,如性别字段只有“男”“女”两个列值,日期的月份部分只有12个整数值等,季度部分只有4个值等。在查询中,这些字段一般用作计数条件,以下为一些典型的查询:

(1)查询员工表中的男性员工数量。

(2)2005年入职的员工总数。

(3)5号部门的员工总数。

对于以上这些查询,在相关字段上创建B树索引,查询效率不会得到显著提高,位图索引恰恰适合这类要求,在处理相关统计操作时,Oracle可以通过扫描位图索引,并执行位运算,从而可以快速定位满足条件的记录。

在当前主流数据库产品中,只有Oracle支持位图索引。文中实验使用的软件版本为Oracle Database 12c企业版。

1  B树索引的结构及适用场景

B树索引在逻辑上可以看作一颗倒立的树,这棵树分为若干层,顶层是树根,底层是树叶,中部是树枝。除树根由一个节点构成外,其他每层都由一个或多个节点构成,每个节点是一个数据块。根据节点所在的层次,分别称为根节点,分支节点及叶节点。B树索引的叶节点存储排序后的索引列值以及列值所在记录的地址,根节点与分支节点可以看作是下层索引的索引,存储其下层每个节点的索引列值范围及其所在数据块的块号。

记录的地址即rowid,由记录的文件号、数据页号、数据页中的槽号(slot)三个属性构成。由此地址可以直接定位至此行的数据。

以下几种情况,应考虑创建B树索引:

(1)在列值重复率低的情况下,应在查询条件包含的列上创建B树索引,以提高查询效率。

(2)若某个字段的函数值重复率低,而且频繁以此函数值作为查询字段,则应在此列上创建基于函数的索引,以提高查询效率。

(3)在连接查询中,大表所包含的连接字段应创建B树索引。

2  位图索引的结构

相比B树索引,位图索引的结构很简单,没有使用树形结构。在数据块中存储的每行索引数据主要由以下三部分构成:

(1)索引键值。

(2)由兩个rowid表示的记录地址范围。

(3)位图。

位图部分中的每个位依序对应第二部分所描述范围内的一个rowid,它用于描述在以上rowid范围内,哪些记录的索引列取得了相应索引键值,如果取得键值则为1,否则为0。

假定表t共有8行记录,其数据存储于4号文件的87号数据块,表t有一个a列,其列值只有red、green、blue三个。表中的记录共8行,其中第1、3行的a列值为red,第2、4、5行的a列值为green,第6、7、8行的a列值为blue。若在a列上创建位图索引,则其包含三行数据,每行数据的三部分内容如表1所示。

查询某个位图索引列值的行数时,只要计算位图索引中对应此值位图中的1的个数即可。

3  位图索引内容的验证

创建测试表t,其位图索引列为a:

SQL> create table t(a char(5),b char(3))

2  tablespace users

3  /

依次執行以下命令,对t表添加测试数据:

insert into t values('red','aaa');

insert into t values('green','bbb');

insert into t values('red','ccc');

insert into t values('green','ddd');

insert into t values('green','eee');

insert into t values('blue','fff');

insert into t values('blue','ggg');

insert into t values('blue','hhh');

创建表空间,以存储位图索引数据:

SQL> create tablespace idxbittbs

2  datafile 'e:\oradata\idxbittbs.dbf'

3  size 1m

4  /

创建位图索引:

SQL> create bitmap index idx_bit_t on t(a)

2  tablespace idxbittbs

3  /

执行以下命令把内存修改数据写入磁盘:

SQL> alter system flush buffer_cache;

使用十六进制原始数据查看工具(如WinHex)中打开数据文件e:\oradata\idxbittbs.dbf,定位至字符串red后,位图数据如图1框中部分所示。

取出其中的第二行数据来分析,其偏移量范围为106 390至106 414,其内容如表2所示。

查询t表中各记录的地址,可以进一步验证以上数据。

SQL> select a,

2  '('

3  ||dbms_rowid.rowid_relative_fno(rowid)

4  ||':'

5  ||dbms_rowid.rowid_block_number(rowid)

6  ||':'

7  ||dbms_rowid.rowid_row_number(rowid)

8  ||')'

9  as "rowid"

10  from t

11  /

A     rowid

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

blue  (4:87:5)

blue  (4:87:6)

blue  (4:87:7)

green (4:87:1)

green (4:87:3)

green (4:87:4)

red   (4:87:0)

red   (4:87:2)

已选择8行。

4  使用位图索进行查询优化

测试表big_table有10 000 000行记录,添加记录时,已经设置其id2字段的列值只有3个不同的值:0、1、2。如果使用id2列作为计数条件,则此列应该创建位图索引。

执行以下命令在id2字段创建位图索引:

SQL> conn system/oracle

已连接。

SQL> create bitmap index idx_bit_id2 on big_table(id2)

2  tablespace idxtbs

3  /

设置以上位图索引为失效状态:

SQL> alter index idx_bit_id2 invisible;

执行以下查询,注意其执行时间:

SQL> set timing on

SQL> select count(*) from big_table

2  where id2=1

3  /

COUNT(*)

----------

3333334

已用时间:  00: 00: 48.25

id2上没有索引,上述查询只能使用全表扫描。

重新设置索引为可用状态:

SQL> alter index idx_bit_id2 visible;

索引已更改。

再次执行以上相同的查询,可以发现此时的执行时间大大降低:

SQL> select count(*)

2  from big_table

3  where id2=1

4  /

COUNT(*)

----------

3333334

已用時间:  00: 00: 00.00

5  位图索引占用的空间

位图索引占用空间很少,可以用以下查询验证以上位图索引占用空间的大小:

SQL> select sum(bytes)/1024/1024 as "SIZE(MB)"

2  from dba_segments

3  where segment_name='IDX_BIT_ID2'

4  /

SIZE(MB)

----------

6.0625

与B树索引相比,位图索引占用的空间基本可以忽略不计了。

6  位图索引不同于B树索引的特点

与B树索引相比,位图索引具备以下特点:

(1)位图索引只存储键值记录的物理地址范围及位图,需要的存储空间非常少。

(2)创建B树索引时,需要执行排序操作,而创建位图索引时,不需要排序,创建速度会比较快。

(3)与B树索引不同,位图索引存储空键值,查询索引列为空的行,可以使用索引。

(4)对表执行计数统计时,直接访问索引即可快速得出结果。

(5)对于B树索引,修改键值时,只会锁定键值所在的行。而对于位图索引,修改键值时,会锁定其键值所在的整个位图范围,若其他连接也修改此范围的键值,则会发生等待。

(6)位图索引应建立在列值重复率很高的列上,一般情况下,外键列上应创建位图索引。

7  结  论

如果需要以表的某个字段执行计数统计,并且这个字段的列值重复率高,则这个字段应该创建位图索引。相对B树索引,位图索引占用空间少。修改位图索引列值时,会同时对原值和新值所在的位图片段加锁,从而大幅降低操作效率,因此,在常用的OLTP应用中应避免创建位图索引。

参考文献:

[1] VAIDYANATHA G K,DESHPANDE K,JR J A k,et al. Oracle Performance Tuning 101 [M].Bangor:Osborne Media,2001.

[2] RICHARD N. Oracle 10g Database Performance Tuning Tips & Techniques [M].New Bangor:Osborne Media,2007.

[3] DONALD K,BURLESON. Oracle High Performance SQL Tuning [M].New York City: McGraw-Hill Education ,2001.

[4] CONWAY H,AULT M,BURLESON D. Oracle Tuning Power Tuning Scripts [M].Kittrell:Rampant Techpress,2005.

[5] LEWIS J. Cost-Based Oracle Fundamentals [M].[S.L]:Apress,2005.

[6] CELKO J. SQL for Smarties:Advanced SQL Programming [M].3rd ed.San Francisco:Morgan Kaufmann,2005.

作者简介:李爱武(1969.07—),男,河北肃宁人,副教授,理学硕士,研究方向:数据库技术,数据分析。

收稿日期:2021-02-12

猜你喜欢
Oracle数据库
Oracle数据库安全管理策略的优化
Oracle数据库应用问题与解决方案分析
一种Oracle数据库表空间监控方法
《Oracle数据库》课程教学模式探究 
基于ORACLE数据库应用系统的优化途径研究
虚拟机技术在Oracle数据库中的探讨与应用研究
Oracle数据库备份与恢复的理论基础
Oracle数据库性能调整与优化分析
Oracle数据库查询语句的优化研究
微课教学模式在Oracle数据库课程中的应用