位图索引的存储原理?位图索引的适用场合
本文目录
- 位图索引的存储原理
- 位图索引的适用场合
- oracle 位图索引的原理
- oracle的索引有几种
- 位图索引和唯一索引的区别
- 数据库索引有哪几种怎样建立索引
- Oracle中的位图索引是什么,怎么用的啊
- Oracle数据库中的最常用的索引有哪些
位图索引的存储原理
位图索引对数据表的列的每一个键值分别存储为一个位图,Oracle对于不同的版本,不同的操作方式,数据生成均有差别.对于8i,9i,下面分3种方式来讨论数据的插入:a.一次插入一行,插入多行后,一次提交;b.每插入一行,提交一次;c.批量插入方式,一次提交;对于第一种方式,观察位图索引的变化情况.a.假设插入8行相同键值的数据,如果以每行方式插入,然后一次提交,则会生成8个位图SQL》 Insert Into H病人挂号记录(Id,No,号别,执行人) Values(1,’G000001’,1,’张1’);1 row insertedSQL》 /1 row insertedSQL》 /1 row insertedSQL》 /1 row insertedSQL》 /1 row insertedSQL》 /1 row insertedSQL》 /1 row insertedSQL》 /1 row insertedSQL》 commit;Commit completeSQL》 alter system dump datafile 1 block 40028;System alteredrow#0 flag: -----, lock: 0col 0; len 3; (3): d5 c5 31 --键值’张1’col 1; len 6; (6): 00 40 9c 54 00 00 --rowid的起始位置col 2; len 6; (6): 00 40 9c 54 00 07 --rowid的终止位置col 3; len 2; (2): c8 ff --位图编码row#1 flag: -----, lock: 0col 0; len 3; (3): d5 c5 31col 1; len 6; (6): 00 40 9c 54 00 08col 2; len 6; (6): 00 40 9c 54 00 0fcol 3; len 2; (2): c8 03row#2 flag: -----, lock: 0col 0; len 3; (3): d5 c5 32col 1; len 6; (6): 00 40 9c 54 00 08col 2; len 6; (6): 00 40 9c 54 00 0fcol 3; len 1; (1): 02row#3 flag: -----, lock: 0col 0; len 3; (3): d5 c5 33col 1; len 6; (6): 00 40 9c 54 00 08col 2; len 6; (6): 00 40 9c 54 00 0fcol 3; len 1; (1): 03row#4 flag: -----, lock: 2col 0; len 3; (3): d5 c5 34col 1; len 6; (6): 00 40 9c 54 00 08col 2; len 6; (6): 00 40 9c 54 00 0fcol 3; len 1; (1): 04row#5 flag: -----, lock: 2col 0; len 3; (3): d5 c5 35col 1; len 6; (6): 00 40 9c 54 00 08col 2; len 6; (6): 00 40 9c 54 00 0fcol 3; len 1; (1): 05----- end of leaf block dump -----但是,下次再插入一行相同键值的数据时,会自动合并这8行位图为一行位图,并生成一个新的索引位图行存放刚插入行的索引:SQL》 Insert Into H病人挂号记录(Id,No,号别,执行人) Values(1,’G000001’,1,’张1’);1 row insertedSQL》 commit;Commit completeSQL》 alter system dump datafile 1 block 40028;System alteredrow#0 flag: -----, lock: 2col 0; len 3; (3): d5 c5 31col 1; len 6; (6): 00 40 9c 54 00 00col 2; len 6; (6): 00 40 9c 54 00 07col 3; len 2; (2): c8 ffrow#1 flag: -----, lock: 2col 0; len 3; (3): d5 c5 31col 1; len 6; (6): 00 40 9c 54 00 08col 2; len 6; (6): 00 40 9c 54 00 0fcol 3; len 1; (1): 00----- end of leaf block dump -----b.数据每行提交方式,与上面的情况相似,但有一点不一样,每提交一行,拷贝原来的位图,生成新的位图,并标记原来的位图为已删除,标记为已删除的位图,只有索引块需要分配新的位图时,才会清除标记为已删除的位图,重用这些空间.在8i,9i上实验的结果,与ITPUB的《Oracle 数据库性能优化》一书378页一致.如果1000条相同键值的数据插入,将生成125个包括8条记录的位图行.c.第三种方式,批量插入数据,insert into H病人挂号记录(Id,No,号别,执行人) select ***方式,同一键值,只生成一次位图,只有一个位图.SQL》 Insert Into H病人挂号记录(Id,No,号别,执行人)Select 1,’G000001’,1,’张1’ From dualUnion AllSelect 2,’G000002’,1,’张1’ From dualUnion AllSelect 3,’G000003’,1,’张1’ From dualUnion AllSelect 4,’G000004’,1,’张1’ From dualUnion AllSelect 5,’G000005’,1,’张1’ From dualUnion AllSelect 6,’G000006’,1,’张1’ From dualUnion AllSelect 7,’G000006’,1,’张1’ From dualUnion AllSelect 8,’G000006’,1,’张1’ From dualUnion AllSelect 9,’G000006’,1,’张1’ From dual;SQL》 commit;Commit completeSQL》 alter system dump datafile 1 block 40028;System alteredrow#0 flag: -----, lock: 2col 0; len 3; (3): d5 c5 31col 1; len 6; (6): 00 40 9c 54 00 00col 2; len 6; (6): 00 40 9c 54 00 0fcol 3; len 3; (3): c9 ff 01row#1 flag: ---D-, lock: 2col 0; NULLcol 1; NULLcol 2; NULLcol 3; NULL----- end of leaf block dump -----所以,位图索引最好采用批量插入方式,这样,每个键值只生成一个位图.而单行数据插入方式,每个键值将每8行数据生成一个位图.10G的情况,则简单得多.上面3种方式,相同键值的插入,位图的生成是一样的,只有一个位图,并且,每次提交时,并不会删除以前的位图,而是直接修改对应键值的位图.每次插入一行数据,插入9行后提交row#0 flag: ------, lock: 2, len=29col 0; len 3; (3): d5 c5 31col 1; len 6; (6): 00 00 00 00 00 00col 2; len 6; (6): 00 40 ef f2 00 0fcol 3; len 8; (8): f9 e4 d5 dc bc 01 ff 01----- end of leaf block dump -----再批量插入9行数据并提交row#0 flag: ------, lock: 2, len=30col 0; len 3; (3): d5 c5 31col 1; len 6; (6): 00 00 00 00 00 00col 2; len 6; (6): 00 40 ef f2 00 17col 3; len 9; (9): fa e4 d5 dc bc 01 ff ff 03----- end of leaf block dump -----可以看出,10G对位图索引的存储进行了优化,一个键值在索引块中只有一个位图注意,其中有些结论并不是完全正确的,可以自己实验证明,另外,该文涉及的实验没有标明Oracle版本,不同的版本,结果有差异.
位图索引的适用场合
1.位图索引是Oracle数据库在7.3版本中加入的,8i,9i企业版和个人版支持,标准版不支持.2.基于规则的优化器无法使用Bitmap索引3.适应于有大量重复值的列查询4.对于8i,9i版本,不适用于单行插入,适用于批量插入的数据,因为单行插入时,相同键值,每插入8行就会生成一行索引块中的位图段,即使相同的值.而批量插入时,相同键值只生成一个位图段.5.由于并发DML操作锁定的是整个位图段的大量数据行,所以位图索引主要是用于OLAP应用,也可以用于OLTP中主要为读操作的表.关于bitmap的两个参数SQL》 show parameter bitmap;NAME TYPE VALUE------------------------------------ ----------- ------------------------------bitmap_merge_area_size integer 1048576create_bitmap_area_size integer 8388608其中bitmap_merge_area_size是bitmap索引进行合并操作时使用的内存区域,create_bitmap_area_size是创建时使用的内存区域.8i,9i中,需要根据bitmap的大小以及常见的使用情况来调整.9i以上,只需设置pga_aggregate_target的值,Oracle即会自动进和内存的调整.
oracle 位图索引的原理
1、语法create bitmap index index_name on 表名(字段);2、举个例子你就能明白了:如有表 test(id,name,address)数据(1,张三,大连)(2,李四,天津)(3,王五,北京)(4,赵六,大连)....类似这样的数据,如果查询的时候用到 ,因为数据库中有很多这样的数据,所以一般的索引起不到查询加速的作用,而建立位图索引后会产生如下位图效果:假设有4条数据(就如上所示)大连 天津 北京 1 0 0 0 1 0 0 0 1 1 0 0这样当查询:select * from 表 where address=’大连’ or address=’北京’;的时候数据库很快就能根据 同行的 1和0 判断出那一条数据符合要求。
oracle的索引有几种
Oracle 提供了多种不同类型的索引以供使用。简单地说, Oracle 中包括如下索引:1、 B* 树索引这些是我所说的 “ 传统 “ 索引。到目前为止,这是 Oracle 和大多数其他数据库中最常用的索引。 B* 树的构造类似于二叉树,能根据键提供一行或一个行集的快速访问,通常只需很少的读操作就能找到正确的行。不过,需要注意重要的一点, ” B* 树 “ 中的 ” B “ 不代表二叉( binary ),而代表平衡( b alanced )。B* 树索引并不是一颗二叉树,这一点在介绍如何在磁盘上物理地存储 B* 树时就会了解到。 B* 树索引有以下子类型:索引组织表( index organized table ):索引组织表以 B* 树结构存储。堆表的数据行是以一种无组织的方式存储的(只要有可用的空间,就可以放数据),而 IOT 与之不同, IOT 中的数据要按主键的顺序存储和排序。对应用来说, IOT 表现得与 “ 常规 “ 表并无二致;需要使用 SQL 来正确地访问 IOT 。 IOT 对信息获取、空间系统和 OLAP 应用最为有用。 IOT 在上一章已经详细地讨论过。B*树聚簇索引( B*tree cluster index )这些是传统 B* 树索引的一个变体(只是稍有变化)。 B* 树聚簇索引用于对聚簇键建立索引(见第 11. 章中 “ 索引聚簇表 “ 一节),所以这一章不再讨论。在传统 B* 树中 ,键都指向一行;而 B* 树聚簇不同,一个聚簇键会指向一个块,其中包含与这个聚簇键相关的多行。降序索引( descending index ):降序索引允许数据在索引结构中按 “ 从大到小 “ 的顺序(降序)排序,而不是按 ” 从小到大 “ 的顺序(升序)排序。我们会解释为什么降序索引很重要,并说明降序索引如何工作。反向键索引( reverse key index ):这也是 B* 树索引,只不过键中的字节会 “ 反转 “ 。利用反向键索引,如果索引中填充的是递增的值,索引条目在索引中可以得到更均匀的分布。例如,如果使用一个序列来生成主键,这个序列将生成诸如 987500 、 987501 、 987502 等值。这些值是顺序的,所以倘若使用一 个传统的 B* 树索引,这些值就可能放在同一个右侧块上,这就加剧了对这一块的竞争。利用反向键, Oracl e则会逻辑地对 205789 、 105789 、 005789 等建立索引。 Oracle 将数据放在索引中之前,将先 把所存储数据的字节反转,这样原来可能在索引中相邻放置的值在字节反转之后就会相距很远。通过反转字节,对索引的插入就会分布到多个块上。2、 位图索引( bitmap index )在一颗 B* 树中,通常索引条目和行之间存在一种一对一的关系:一个 索引条目就指向一行。而对于位图索引,一个索引条目则使用一个位图同时指向多行。位图索引适用于高度重复而且通常只读的数据(高度重复是指相对于表中的总行数,数据只有很少的几个不同值)。考虑在一 个有 100 万行的表中,每个列只有 3 个可取值: Y 、 N 和 NULL 。举例来说,如果你需要频繁地统计多少行有值Y ,这就很适合建立位图索引。不过并不是说如果这个表中某一列有 11.000 个不同的值就不能建立位图索引,这一列当然也可以建立 位图索引。在一个 OLTP 数据库中,由于存在并发性相关的问题,所以不能考虑使用位图索引(后面我们就会讨论这一点)。注意,位图索引要求使用 Oracle 企业版或个人版。位图联结索引( bitmap join index ):这为索引结构(而不是表)中的数据提供了一种逆规范化的 方法。例如,请考虑简单的 EMP 和 DEPT 表。有人可能会问这样一个问题: “ 多少人在位于波士顿的部门工作 ?“ EMP 有一个指向 DEPT 的外键,要想统计 LOC 值为 Boston 的部门中的员工人数,通常必须完成表联结,将 LOC 列联结至 EMP 记录来回答这个问题。通过使用位图联结索引,则可以在 EMP 表上对 LOC 列建立索引 。3、 基于函数的索引( function-based index )这些就是 B* 树索引或位图索引,它将一个函数计算得到的结果存储在行的列中,而不是存储列数据本身。可以把基于函数的索引看作一个虚拟列(或派生列)上的索引,换句话说,这个列并不物理存储在表中。基于函数的索引可以用于加快形如 SELECT * FROM T W HERE FUNCTION(DATABASE_COLUMN) = SAME_VALUE 这样的查询,因为值 FUNCTION(DATABASE_COLUMN) 已经提前计算并存储在索引中。4、 应用域索引( application domain index )应用域索引是你自己构建和存储的索引,可能存储在Oracle 中,也可能在 Oracle 之外。你要告诉优化器索引的选择性如何,以及执行的开销有多大,优化器则会根据你提供的信息来决定是否使用你的索引。 Oracle 文本索引就是应用域索引的一个例子;你也可 以使用构建 Oracle 文本索引所用的工具来建立自己的索引。需要指出,这里创建的 “ 索引 “ 不需要使用传统的索引结构。例如, Oracle 文本索引就使用了一组表来实现其索引概念。5、HASH索引使用HASH索引必须要使用HASH群集。建立一个群集或HASH群集的同时,也就定义了一个群集键。这个键告诉Oracle如何在群集上存储表。在存储数据时,所有与这个群集键相关的行都被存储在一个数据库块上。若数据都存储在同一个数据库块上,并且使用了HASH索引,Oracle就可以通过执行一个HASH函数和I/O来访问数据——而通过适用一个二元高度为4的B-树索引来访问数据,则需要在检索数据时使用4个I/O。技巧:HASH索引在有限制条件(需要指定一个确定的值而不是一个值范围)的情况下非常有用。6、分区索引分区索引就是简单地把一个索引分成多个片断,这样可以访问更小的片断,并且可以把这些片断分别存放在不同的硬盘上(避免I/O问题)。B-数索引和位图索引都可以被分区,HASH索引不可以被分区。有两种类型的分区索引:本地分区索引和全局分区索引。每个类型都有两个子类型,有前缀索引和无前缀索引。如果使用了位图索引就必须是本地索引。把索引分区最主要的原因是可以减少所需读取的索引的大小,另外把分区放在不同的表空间中可以提高分区的可用性和可靠性。
位图索引和唯一索引的区别
用于低基数列时,位图索引比b树索引更紧凑。由于位图使用位图段级锁定,所以位图索引中的键列的更新成本较高;而在b树索引中,锁位于与表中单个行相对应的项上。位图索引可用于执行位图布尔等操作。oracle服务器可以使用两个位图段执行逐位布尔操作并得到一个结果位图。这将允许在使用布尔谓词的查询中更有效地使用位图。总之,b树索引更适合索引动态表的oltp环境,而位图索引更适合在大型静态表上使用复杂查询的数据仓库环境。
数据库索引有哪几种怎样建立索引
种类:
1、按照索引列值的唯一性,索引可分为唯一索引和非唯一索引;
非唯一索引:
create index 索引名 on 表名(列名) tablespace 表空间名;
唯一索引:
建立主键或者唯一约束时会自动在对应的列上建立唯一索引;
2、索引列的个数:单列索引和复合索引;
3、按照索引列的物理组织方式。
索引的创建格式:
CREATE UNIUQE | BITMAP INDEX 《schema》.《index_name》 ON 《schema》.《table_name》 (《column_name》 | 《expression》 ASC | DESC, 《column_name》 | 《expression》 ASC | DESC,...) TABLESPACE 《tablespace_name》 STORAGE 《storage_settings》 LOGGING | NOLOGGING COMPUTE STATISTICS NOCOMPRESS | COMPRESS《nn》 NOSORT | REVERSE PARTITION | GLOBAL PARTITION《partition_setting》
使用USER_IND_COLUMNS查询某个TABLE中的相应字段索引建立情况
使用DBA_INDEXES/USER_INDEXES查询所有索引的具体设置情况。
在Oracle中的索引可以分为:B树索引、位图索引、反向键索引、基于函数的索引、簇索引、全局索引、局部索引等,下面逐一讲解:
一、B树索引:
最常用的索引,各叶子节点中包括的数据有索引列的值和数据表中对应行的ROWID,简单的说,在B树索引中,是通过在索引中保存排过续的索引列值与相对应记录的ROWID来实现快速查询的目的。其逻辑结构如图:
可以保证无论用户要搜索哪个分支的叶子结点,都需要经过相同的索引层次,即都需要相同的I/O次数。
B树索引的创建示例:
create index ind_t on t1(id) ;
注1:索引的针对字段创建的,相同字段不能创建一个以上的索引;
注2:默认的索引是不唯一的,但是也可以加上unique,表示该索引的字段上没有重复值(定义unique约束时会自动创建);
注3:创建主键时,默认在主键上创建了B树索引,因此不能再在主键上创建索引。
二、位图索引:
有些字段中使用B树索引的效率仍然不高,例如性别的字段中,只有“男、女”两个值,则即便使用了B树索引,在进行检索时也将返回接近一半的记录。
所以当字段的基数很低时,需要使用位图索引。(“低”的标准是取值数量 《 行数*1%)
位图索引的逻辑结构如上图所示:索引中不再记录rowid和键值,而是将每个值作为一列,用0和1表示该行是否等于该键值(0表示否;1表示是)。其中位图索引的行顺序与原表的行顺序一致,可以在查询数据的过程中对应计算出行的原始物理位置。
位图索引的创建示例:
create bitmap index ind_t on t1(type);
注:位图索引不可能是唯一索引,也不能进行键值压缩。
三、反向键索引:
考虑这个情况:某一字段的值是1-1000顺序排列,建立B树索引后依旧递增,到后来该B数索引不断在后面增加分支,会形成如下如的不对称树:
反向键索引是一种特殊的B树索引,在存储构造中与B树索引完全相同,但是针对数值时,反向键索引会先反向每个键值的字节,然后对反向后的新数据进行索引。例如输入2008则转换为8002,这样当数值一次增加时,其反向键在大小中的分布仍然是比较平均的。
反向键索引的创建示例:
create index ind_t on t1(id) reverse;
注:键的反转由系统自行完成。对于用户是透明的。
四、基于函数的索引:
有的时候,需要进行如下查询:select * from t1 where to_char(date,’yyyy’)》’2007’;
但是即便在date字段上建立了索引,还是不得不进行全表扫描。在这种情况下,可以使用基于函数的索引。其创建语法如下:
create index ind_t on t1(to_char(date,’yyyy’));
注:简单来说,基于函数的索引,就是将查询要用到的表达式作为索引项。
五、全局索引和局部索引:
这个索引貌似很复杂,其实很简单。总得来说一句话,就是无论怎么分区,都是为了方便管理。
具体索引和表的关系有三种:
1、局部分区索引:分区索引和分区表1对1
2、全局分区索引:分区索引和分区表N对N
3、全局非分区索引:非分区索引和分区表1对N
创建示例:
首先创建一个分区表
create table student
(
stuno number(5),
sname vrvhar2(10),
deptno number(5)
)
partition by hash (deptno)
(
partition part_01 tablespace A1,
partition part_02 tablespace A2
);
创建局部分区索引(1v1):
create index ind_t on student(stuno)
local(
partition part_01 tablespace A2,
partition part_02 tablespace A1
); --local后面可以不加
创建全局分区索引(NvN):
create index ind_t on student(stuno)
global partition by range(stuno)
(
partition p1 values less than(1000) tablespace A1,
partition p2 values less than(maxvalue) tablespace A2
); --只可以进行range分区
创建全局非分区索引(1vN)
create index ind_t on student(stuno) GLOBAL;
根据具体问题类型,进行步骤拆解/原因原理分析/内容拓展等。具体步骤如下:/导致这种情况的原因主要是……
Oracle中的位图索引是什么,怎么用的啊
1、语法create bitmap index index_name on 表名(字段);2、举个例子你就能明白了:如有表 test(id,name,address)数据(1,张三,大连)(2,李四,天津)(3,王五,北京)(4,赵六,大连)....类似这样的数据,如果查询的时候用到 【where address=’大连’】,因为数据库中有很多这样的数据,所以一般的索引起不到查询加速的作用,而建立位图索引后会产生如下位图效果:假设有4条数据(就如上所示)大连 天津 北京 1 0 0 0 1 0 0 0 1 1 0 0这样当查询:select * from 表 where address=’大连’ or address=’北京’;的时候数据库很快就能根据 同行的 1和0 判断出那一条数据符合要求。---以上,希望对你有所帮助。
Oracle数据库中的最常用的索引有哪些
1. b-tree索引Oracle数据库中最常见的索引类型是b-tree索引,也就是B-树索引,以其同名的计算科学结构命名。CREATE INDEX语句时,默认就是在创建b-tree索引。没有特别规定可用于任何情况。2. 位图索引(bitmap index)位图索引特定于该列只有几个枚举值的情况,比如性别字段,标示字段比如只有0和1的情况。3. 基于函数的索引比如经常对某个字段做查询的时候是带函数操作的,那么此时建一个函数索引就有价值了。
本文相关文章:
nas个人云存储(如何使用群晖NAS建造个人私有云,湖北群晖云存储)
2024年9月14日 21:35
苹果6s最小内存是多少(iPhone6s存储容量是多少 iPhone6s内存有多大)
2024年9月9日 22:00
磁带存储器类似于家用的磁带录音机其区别是磁带存储器记录的是什?磁带存储器的分类
2024年8月10日 02:40
魔兽世界interface(魔兽世界Interface Cache WTF 这三个文件夹分别存储什么信息)
2024年7月19日 22:00
IBM公司的第一台磁盘存储器?IBM存储DS88700更换ssd盘
2023年12月15日 13:21
神奇蜘蛛侠2(神奇蜘蛛侠2没有足够存储空间,游戏没法存档,求大神来破)
2023年12月12日 12:15
windows mail(windowsmail可压缩邮件存储,这可能需要几分钟是什么意思,怎么会出现)
2023年12月8日 08:01
mysqlprocedure(mysql 存储过程怎么调用)
2023年12月6日 00:20
更多文章:
自动修复无法修复你的电脑(电脑显示“自动修复无法修复你的电脑”,该怎么办)
2024年5月24日 01:43
中兴axon30(中兴刚刚发布的中兴Axon30到底好不好值不值得购买)
2024年7月24日 22:10
zuk z2刷机包miui(miui官网有没有给zukz2pro提供刷机包)
2024年1月13日 08:35
卡刷包下载网站(安卓手机的官方卡刷包和官方线刷包去哪下载vivo官方网站在哪为什么找不到)
2024年7月18日 06:18
海尔电视的缺点在哪里(海尔电视到底怎么样现在海尔电视真的有人说的那么不堪吗)
2024年5月25日 09:01
1070ti和1080差多少(显卡1070跟1080有什么区别)
2024年5月23日 20:50
oppou521软件(OPPO U521 怎么样下载最新版的手机QQ啊)
2024年9月22日 15:05