于位图索引相关的执行计划

位图索引是oracle数据库里除B树索引之外的另外一种索引的类型,它主要用于数据仓库或者DSS系统。在数据仓库或DSS系统中,针对某些类型的sql,用位图索引比用B树索引要快很多,这主要是位图索引实现了快捷的按位运算的缘故。

位图索引的物理存储结构和普通B树索引的物理存储结构相似,也是按照被索引的键值列有序存储,只不过和索引键值一起存储的不再仅仅是索引键值所对应的rowid,而是变成了三部分的组合。这三部分分别为对应rowid的下限,对应rowid的上限和被压缩存储的位图(Bitmap Segment,位图段最大只能为位图索引叶子块大小的1/2),即oracle数据库中位图索引的物理存储结构:<被索引的键值,对应rowid的下限,对应rowid的上限,位图段>,这里位图段是压缩存储的,解压缩后就是一连串0和1的二进制位图序列,其中1表示被索引键值的一个有效rowid,oracle通过一个转换函数(mapping function)将解压缩段的位图段中的1结合对应rowid的上下限,转换为被索引键值所对应的有效rowid。

上述位图索引的物理存储结构决定了oracle数据库中位图索引的锁粒度是在索引行的位图段上。对于oracle数据库的位图索引而言,它是没有行锁这个概念的,要锁就锁索引行的整个位图,而多个数据行可能对应同一索引的位图段。这种锁的粒度就决定了位图索引不适用于高并发频繁修改的OLTP系统,如果在高并发且频繁修改的OLTP系统中使用了位图索引,很可能会导致严重的并发问题,甚至会产生死锁。

我们来看一个因为位图索引而导致常见的并发insert操作出现死锁的例子。创建一个测试表T1:

SQL> create table t1(id number,sex char(20));

Table created.

在T1表中插入10000条数据:

SQL> begin

2  for i in 1..5000 loop

3  insert into  t1 values(i,‘MALE‘);

4  insert into t1 values(i,‘FEMALE‘);

5  end loop;

6  end;

7  /

PL/SQL procedure successfully completed.

在T1的列SEX上创建一个位图索引IDX_BITMAP_T1:

SQL> create bitmap index idx_bitmap_t1 on t1(sex);

Index created.

现在我们来构造死锁的情景,首先session 1中插入一条记录但不commit:

SQL> insert into t1 values(10001,‘MALE‘);

1 row created.

接着到session 2,插入一条记录但不commit:

SQL> insert into t1 values(10002,‘FEMALE‘);

1 row created.

回到session 1,再插入一条记录,这时这个插入操作hang住了:

SQL> insert into t1 values(10003,‘FEMALE‘);--hang住

再回到session 2,又插入一条记录,这时这个插入操作也hang住了:

SQL> insert into t1 values(10004,‘MALE‘);

第2次回到session 1,这里oracle已经检测出了死锁:

SQL> insert into t1 values(10003,‘FEMALE‘);

insert into t1 values(10003,‘FEMALE‘)         *

ERROR at line 1:

ORA-00060: deadlock detected while waiting for resource

这里的原理是当插入一条记录时,oracle需要去维护位图索引IDX_BITMAP_T1中所对应键值的位图段,因为记录数较少并且oracle是压缩存储位图段的缘故,所有sex值male的5000条记录对应的都是同一条索引行,sex值为female的5000条记录对应也是同一条索引行。这也意味着当插入一条新的sex值为male的那5000条记录);但插入一条新的sex值为female的记录时,oracle会锁原先所有sex值为female的那5000条记录所对应的位图段(即相当于锁了所有sex值为female的那5000条记录),所以通常情况下不会出现死锁的并发insert操作就这样出现了死锁。

与B树索引相比,位图索引的优势主要体现在如下几个方面:

(1)因为位图索引的位图段的是压缩后存储的,所以如果被索引的distinct值较少,那么位图索引段与同列上的B树索引比起来,会显著节省空间。比如上例中表T的SEX列,其distinct 值仅为2,虽然表T1的数据量为10000,但SEX列上单键值位图索引idx_bitmap_t中只有两个索引行,而如果sex列上创建单键值B树索引,则显然该B树索引中的索引行的数量会是10000.

(2)如果需要再多个列上创建索引,那么位图索引与同等条件下的B树索引比起来,往往会显著节省存储空间。比如针对表CUSTOMER上的三列master_status,region和gender,用户可能会使用上述三列中任意单列或多列去访问表customer,如果此时要建B树索引,那么需要建三个复合B树索引(这里考虑到了复合B树索引可以代替单键值B树索引吗,三列复合B树索引可以代替两列复合B树索引)才能涵盖所有的情况,而如果是建位图索引的话,则只需要建三个针对上述三列的单键值位图索引就够了。

(3)位图索引能够快速处理一些包含了各种AND或OR查询条件的sql,这主要是因为位图索引能够实现快捷的按位运算的缘故。

关于位图索引能够实现快捷的按位运算的原理,我们用一个实例来说明。创建一个测试表customer:

SQL> create table customer(customer# number,marital_status varchar2(10),region varchar2(10),gender varchar2(10),income_level varchar2(10));

Table created.

使用如下sql插入6条记录:

SQL> insert into customer values(101,‘single‘,‘east‘,‘male‘,‘bracket_1‘);

1 row created.

SQL> insert into customer values(102,‘married‘,‘central‘,‘female‘,‘bracket_4‘);

1 row created.

SQL> insert into customer values(103,‘married‘,‘west‘,‘female‘,‘bracket_2‘);

1 row created.

SQL> insert into customer values(104,‘divorced‘,‘west‘,‘male‘,‘bracket_4‘);

1 row created.

SQL> insert into customer values(105,‘single‘,‘central‘,‘female‘,‘bracket_2‘);

1 row created.

SQL> insert into customer values(106,‘married‘,‘central‘,‘female‘,‘bracket_3‘);

1 row created.

SQL> commit;

Commit complete.

在列region上创建一个位图索引idx_b_region

SQL> create bitmap index idx_b_region on customer(region);

Index created.

在列martial_status上创建另外一个位图索引idx_b_martialstatus:

SQL> create bitmap index idx_b_maritalstatus on customer(marital_status);

Index created.

SQL> select * from customer;

CUSTOMER# MARITAL_ST REGION GENDER     INCOME_LEV

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

101 single     east male    bracket_1

102 married    central female     bracket_4

103 married    west female     bracket_2

104 divorced   west male    bracket_4

105 single     central female     bracket_2

106 married    central female     bracket_3

6 rows selected.

时间: 2024-10-24 21:49:15

于位图索引相关的执行计划的相关文章

MySQL 索引管理与执行计划

原文:MySQL 索引管理与执行计划 1.1 索引的介绍 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息.如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息. 索引的一个主要目的就是加快检索表中数据的方法,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构. 1.1.1 唯一索引 唯一索引是不允许其中任何两行具有相同索引值的索引.当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一

聚焦-使用索引和查询执行计划(五)

前言 上一篇我们讲了聚集索引对非聚集索引的影响,对数据库一直在强调的性能优化,所以这一节我们统筹讲讲利用索引来看看查询执行计划是怎样的,简短的内容,深入的理解. 透过索引来看查询执行计划 我们首先来看看第一个例子 1.默认使用索引 USE TSQL2012 GO SELECT orderid FROM Sales.Orders SELECT * FROM Sales.Orders 上述我们看到第2个查询的所需要的开销是第1个查询开销的3倍,当然其中也涉及到第1个查询只是返回一列而第2个查询返回所

MySQL索引管理及执行计划

第1章 索引介绍: 索引是对数据库表中一列或者多了的值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息,如果想按特定职员的姓名来查找,则与他在表中搜索所有的行相比,索引有助于更快的获取信息 索引的一个主要目的就是加快检索表中的数据的方法,既能协助信息搜索者尽快找到符合限制条件的记录ID的辅助数据结构 1.1 索引的类型介绍: btree:B+树索引    最为常用 hash:hash索引 fulltest:全文索引 rtree:r数索引 第2章 索引管理 2.1 B树索引的分类: 主

Mysql索引、explain执行计划

1.索引的使用场景 哪些情况使用索引: 1.主键自动建立唯一索引 2.频繁作为查询条件的字段应该创建索引 where 3.多表关联查询中,关联字段应该创建索引on两边都要创建索引 select * from user left join order on user.id = order.userid 4.查询中排序的字段,应该创建索引B + tree 有顺序 5.覆盖索引 好处是?不需要回表组合索引 user表 组合索引(name,age) select * from user -------

MySQL学习【第七篇索引管理及执行计划】

一.索引介绍 1.什么是索引? 索引由如字典,目的就是为了更快寻找到要找的内容. 令搜索查询的数据更有目的性,从而提高数据检索的能力 2.索引类型介绍 1.BTREE: B+树索引 2.HASH: HASH 索引 3.FULLTEXT: 全文索引 4.RTREE:R树索引 一般人不用懂上面4种算法!!!!!讲起来太特么麻烦了!!!! 简单介绍下hash索引一般就是查url的,网址一般都很长,查询则会变得十分麻烦,而hash则是令这一段url定义为一个hash值指向url,查找就是查这个hash值

oracle常见的执行计划

访问表的执行计划: 全表扫描:TABLE ACCESS FULL ROWID扫描:TABLE ACCESS BY USER ROWID (ROWID来源于用户在where条件中的指定)或 TABLE ACCESS BY INDEX ROWID(rowid来源于索引) 与B树索引相关的执行计划: 索引唯一扫描:INDEX UNIQUE SCAN 索引范围扫描:INDEX RANGE SCAN 索引全扫描:INDEX FULL SCAN 索引快速全扫描:INDEX FAST FULL SCAN 索引

Oracle里的常见的执行计划

与表访问相关的执行计划 Oracle数据库里面与表访问有关的的两种方法:全表扫描和ROWID扫描.反应在执行计划上,与全表扫描对应的执行计划中的关键字是"TABLE ACCESS FULL",与ROWID扫描对应的执行计划中的关键字是"TABLE ACCESS BY USER ROWID"或"TABLE ACCESS BY INDEX ROWID". 我们来看一下与表访问的相关的执行计划,先执行如下SQL: SQL> select empn

数据库-Oracle通过执行计划查看查询语句是否使用索引【转】

1.生成执行计划 explain plan for select * from t_call_records where t_bjhm='123456' 备注:explain plan for后面为要生成执行计划的查询语句 2.查看执行计划结果 select * from table(dbms_xplan.display) 如上图所示,TABLE ACCESS FULL为全表扫描; 为t_bjhm列加上索引后生成执行计划并查看结果: 如上图所示,index range scan为索引范围扫描;

SQL Server 执行计划缓存

原文:SQL Server 执行计划缓存 标签:SQL SERVER/MSSQL SERVER/数据库/DBA/内存池/缓冲区 概述 了解执行计划对数据库性能分析很重要,其中涉及到了语句性能分析与存储,这也是写这篇文章的目的,在了解执行计划之前先要了解一些基础知识,所以文章前面会讲一些概念,学起来会比较枯燥,但是这些基础知识非常重要. 目录 概述 基础概念 怎样缓存执行计划 SQL Server自动删除执行计划 重新编译执行计划 测试 执行计划相关系统视图 手动清空缓存执行计划 测试索引更改对执