Oracle B-Tree索引与Bitmap索引的锁代价的比较

环境:

SQL> select * from v$version;

BANNER

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

Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production

PL/SQL Release 11.2.0.1.0 - Production

CORE  11.2.0.1.0   Production

TNS for 32-bit Windows: Version 11.2.0.1.0 - Production

NLSRTL Version 11.2.0.1.0 - Production

--理论介绍

1)Bitmap index

场合:列的基数很少,可枚举,重复值很多,数据不会被经常更新

原理:一个键值对应N行,即 (键值:rowid)=(1:n)

格式:键值|start_rowid|end_rowid|位图

优点:

① OLAP

② 重复率高的数据,也就是低cardinality列,例如“性别”列,列值只有“M”,“F”两种

③ 特定类型的查询例如count、or、and等逻辑操作因为只需要进行位运算即可得到我们需要的结果

④ 位图以一种压缩格式存放,因此占用的磁盘空间比B-Tree索引要小得多

缺点:

① 不适合重复率低的字段

② 经常DML操作(insert,update,delete),因为位图索引的锁代价极高,会导致一些DML语句出现“锁等待”,例如修改一个键值,会影响同键值的多行,所以对于OLTP系统位图索引基本上是不适用的

2) B-Tree index

场合:非常适合数据重复度低的字段 例如 身份证号码 手机号码 QQ号等字段,常用于主键、唯一性约束,一般在在线交易的项目中用到的多些。

原理:一个键值对应一行(rowid)

格式: 索引头|键值|rowid

优点:

① 查询性能与表中数据量无关,例如 查2万行的数据用了3 consistent get,当查询1200万行的数据时才用了4 consistent gets。

② 当我们的字段中使用了主键or唯一约束时,不用想直接可以用B-tree索引

缺点:不适合键值重复率较高的字段上使用,例如 第一章 1-500page 第二章 501-1000page

--实验

①--建表

SQL> create table t_bitmap (id number(10),name varchar2(10),sex varchar2(1));

表已创建。

SQL> create bitmap index t_bitmap_idx on t_bitmap(sex);

索引已创建。

SQL> create table t_btree (id number(10),name varchar2(10),sex varchar2(1));

表已创建。

SQL> create index t_btree_idx on t_btree(sex);

索引已创建。

SQL> insert into t_btree values (1,'think','M');

已创建 1 行。

SQL> insert into t_btree values (2,'qinqin','F');

已创建 1 行。

SQL> insert into t_bitmap values(1,'think','M');

已创建 1 行。

SQL> insert into t_bitmap values(2,'qinqin','F');

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from t_btree;

   ID NAME    S

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

    1 think   M

    2 qinqin   F

SQL> select * from t_bitmap;

   ID NAME    S

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

    1 think   M

    2 qinqin   F

②--对Btree index进行DML

***********session_A***************

SQL> insert into t_btree values (3,'hangzhen','M');

已创建 1 行。

***********session_B***************

SQL> insert into t_btree values (4,'yuechuang','M');

已创建 1 行。

SQL> update t_btree set sex='M' where id=2;

已更新 1 行。

SQL> delete from t_btree;

已删除3行。

③--对Bitmap index进行DML

时间: 2024-11-02 08:31:36

Oracle B-Tree索引与Bitmap索引的锁代价的比较的相关文章

bitmap 索引和 B-tree 索引在使用中如何选择_oracle

现在,我们知道优化器如何对这些技术做出反应,清楚地说明 bitmap 索引和 B-tree 索引各自的最好应用. 在 GENDER 列适当地带一个 bitmap 索引,在 SAL 列上创建另外一个位图索引,然后执行一些查询.在这些列上,用 B-tree 索引重新执行查询. 从 TEST_NORMAL 表,查询工资为如下的男员工: 1000 1500 2000 2500 3000 3500 4000 4500 因此: SQL> select * from test_normal 2 where s

Oracle B*tree索引和Oracle Bitmap索引有什么区别

(1) 建立B*tree索引 3:11:08 SQL>create index emp1_job_ind on emp1(job); (2)分析索引结构 3:11:08 SQL> ANALYZE INDEX EMP1_JOB_IND VALIDATE STRUCTURE; Index analyzed. (3)查看索引存储信息 03:11:41 SQL> SELECT BLEVEL,LEAF_BLOCKS,NUM_ROWS FROM USER_INDEXES 03:12:12   2  

[20151008]索引组织表上创建BITMAP索引.txt

[20151008]索引组织表上创建BITMAP索引.txt --IOT 是一种特殊的索引结构,使用它能够解决特定场合的应用问题,但是在许多应用中很少使用,更多的是使用堆表. --我偏向使用静态以及"只读"的小表. --以前写过一个系列,一直没有很好理解在IOT表上建立位图索引,最近再研究看看; --我当时不理解为什么mapping table与iot表对应的块为什么不一致? 1.建立测试环境: SCOTT@test> @ver1 PORT_STRING             

Oracle分区(2) 分区索引

可能很多初学者和我一样,一开始以为只要在分区表上创建的索引就是分区索引,其实不然,索引 是否分区和表是否分区没有必然的关系,表分区索引可以分区也可以不分区,甚至表不分区索引也可 以分区(但很少会这么定义),因此分区索引比分区表要复杂的多. 分区索引主要分为本地分区索引和全局分区索引,本地索引又分为前缀索引和非前缀索引,本文主 要探讨它们的区别. 本地分区索引 本地分区索引是指索引的分区键.分区方式和基表的分区方式一模一样,如下图所示: 本地分区索引具有如下基本特征: 1. 本地索引一定是分区索引

Greenplum 最佳实践 - 什么时候选择bitmap索引

标签 PostgreSQL , Greenplum , bitmap index 背景 PostgreSQL 目前支持8种索引接口,包括B-Tree, hash, gin, gist, sp-gist, brin, rum, bloom. Greenplum 目前支持B-Tree, GiST, bitmap三种索引接口. 用户可以根据不同的数据类型,不同的请求类型,使用不同的索引接口建立相应的索引.例如对于数组,全文检索类型,可以使用GIN索引,对于地理位置数据,范围数据类型,图像特征值数据,几

oracle中如何使用视图,索引,存储过程。 就是说怎么去用或者用在什么地方,请指教

问题描述 oracle中如何使用视图,索引,存储过程. 就是说怎么去用或者用在什么地方,请指教 oracle中如何使用视图,索引,存储过程. 就是说怎么去用或者用在什么地方,请指教 解决方案 具体你去看书,这里只是简单说说:视图,相当于虚拟的表,你可以把不同的表连接起来得到一个视图,直接像表那样返回数据,而不用写复杂的查询了.索引,顾名思义,对表中的数据预处理,加快查询的速度.存储过程,一组预先写好的sql代码的集合,可以直接调用.存储过程因为是事先写好,并且编译的,所以更快,而且它像函数那样,

Oracle与Mysql主键、索引及分页的区别小结_oracle

区别: 1.主键,Oracle不可以实现自增,mysql可以实现自增. oracle新建序列,SEQ_USER_Id.nextval 2.索引: mysql索引从0开始,Oracle从1开始. 3.分页, mysql: select * from user order by desc limit n ,m. 表示,从第n条数据开始查找,一共查找m条数据. Oracle:select * from user select rownum a * from ((select * from user)a

Oracle如何预估将要创建的索引和表的大小

Oracle如何预估将要创建的索引和表的大小 1. 对于表和索引空间的预估,可以使用DBMS_SPACE包的CREATE_TABLE_COST和CREATE_INDEX_COST存储过程,虽然没有看这两个存储过程的实现,但猜测平均行长算法,会根据预计行数,做一些计算,字段定义算法,则会根据每个字段的长度,和预计行数,做一些计算,其实和我们手工根据这些算法,计算的方式类似,只是封装起来,便于调用. 2. CREATE_TABLE_COST根据列字段定义预估,是比较准确的,根据平均行长,并不很准确.

位图索引(Bitmap Index)——索引共用

  位图索引区别于传统B*树索引有两个结构特点:其一是叶子节点上是一个可能的索引列取值对应一个叶子节点.另一个就是叶子节点上通过一个位图向量表示对应行是否取定这个索引值.   使用位图向量记录对应行的取值情况不仅可以带来存储空间上的节省,而且可以借助计算机位图运算的快速特性来提高索引结果利用率.下面我们通过模拟情况来进行分析.   Bitmap Index模拟说明   假设存在数据表T,有两个数据列A和B,取值如下.   序号 A B 1 L 1 2 T 2 3 L 2 4 M 1   对两个数