众所周知,索引可以在很大程度上提高数据库的查询效率。但是如果索引使用不当,如在不恰当的地方采用了不恰当的索引,那么反而会起到适得其反的效果。如下图所示的表,该采用什么索引呢?笔者借这个机会,跟大家讨论一下位图索引的使用时机以及注意事项。
一、 B树索引的缺陷。
在实际工作中,B树索引是Oracle数据库中最常用的一种索引。如在使用Create
Index语句创建索引的时候,默认采用的就是B树索引。在B树索引中,是通过在索引中保存排序过的索引列以及其对应的Rowid列的值来实现的。不过对
于某些比较特殊的情况,如基数比较小的列,使用这个B树索引反而会降低数据库的查询效率。
基数在Oracle数据库中指的是某个列可能拥有的不重复数值的个数。如上图为例,SEX指员工的性别,一般就只有男女两个值(其中1代表男、
0代表女),其基数就为2。假设企业要组织公司所有的女员工出去旅游,作为三八妇女节的礼物。为此就需要查询出公司所有女员工的信息。此时如果在性别列上
加入B树索引,那么反而会得到适得其反的效果。查询效率不但没有提升,反而下降。
在这些基数比较小的列上创建B树索引并对其进行查询的话,系统就会返回大量的记录。因而这并不是具有高度选择性的索引,并不能够显著提高查询的速度。当然并不是说B树索引不好,而是指其没有用对地方。
二、 位图索引的特点以及使用时机。
在数据库中(包括Sql Server数据库),对于这种基数比较小的列,如果只有有限的几个固定值,如上表中的性别、婚姻状况等等,要为其建立索引的话,采用的就应该是位图索引,而不是B树索引。
位图索引为什么可以提高基数比较小的表的查询速度呢?这主要是因为在创建位图索引的时候,数据库往往会对整个表进行扫描,并未索引列的每个取值
建立一个位图(位图索引的名字也由此而来)。在这个位图中,为表中的每一行使用一个位元来表示该行是否包含该位图的索引列的取值。位元到行的ROWID的
对应关系通过位图索引中的应收函数来完成。如此的话,位图索引就能够以一种完全不同的内部机制来完成与B树索引相同的功能。
另外值得一提的是,对于B树索引而言,如果在查询条件语句中采用了AND等操作符号,其查询的效率会大打折扣。故在数据库优化中,会建议大家不
要使用这些操作符,改用其他操作符代替。不过如果采用位图索引的话,则没有这方面的顾虑。如上例所示,假设用户需要查找已婚的女性,那么就可以使用如下的
语句查询。
select t.*, t.rowid
from userinfo t
where t.merital='已婚' and t.sex=0
这个查询引用了一些创建了位图索引的列时,这些位图可以很方便的与AND或者OR操作符结合以找出想要的数据。数据库在后台处理的时候,先利用
已经创建的位图进行逻辑运算,然后计算结果位图中1的个数,就可以查询到满足条件的所有记录。如果查询到结果后还需要更改数据的话,那么只需要按照结果位
图中取1的位元对应的ROWID列的值进行映射即可。
三、 位图索引的使用限制。
位图索引虽然在某些情况下能够起到比B树索引更好的效果。但是需要注意的是,并不是在任何场合都有效。如上例所示,如果在员工编号或者员工姓名
列中使用的话,反而会降低数据查询的效率。故其使用仍然受到比较大的限制。如上面列举的案例,一般情况下只有在“基数比较小的列中”和“需要使用与和或的
运算中”采用位图索引能够起到比B树索引更好的效果。其他情况还是使用B数索引或者函数索引为好。
在Oracle数据库中,有B树索引、位图索引、函数索引等等。具体采用哪种索引,还是要根据不同的情形来对待。随着数据库应用越来越复杂,单
靠一个B树索引已经不能够应付了。如列中包含了表达式或者函数的话,B树索引或者位图索引都不能够用,只有用函数索引。对于数据库专家来说,索引的创建与
管理或许没有难度,只需要简单的几个语句即可。比较困难的是,如何根据实际情况来选择合适的索引。
分享到:
相关推荐
位图索引是Oracle数据库中的一种特殊索引类型,它在特定场景下能显著提高查询效率,尤其是在处理基数较小(即列中不重复值数量)的列时。本文将探讨如何通过四个策略来优化位图索引的使用。 首先,我们需要理解何时...
在查询中,这些字段一般用作计数条件,使用 B 树索引,查询效率不会得到显著提高,而位图索引恰恰适合这类要求。 三、位图索引的优点 位图索引有以下几个优点: * 高效查询:位图索引可以快速定位满足条件的记录...
"合理创建和使用索引提高Oracle查询效率" 索引是Oracle数据库管理系统中的一种重要数据结构。它可以大大提高查询效率,减少I/O操作。索引可以是B+树索引、簇索引、散列簇索引、反序索引、位图索引和函数索引等多种...
- **减少子查询**:子查询可能导致多次表访问,合并子查询或使用连接操作有时能提高效率。 - **使用EXISTS替代IN**:当需要检查子查询结果是否包含主查询中的记录时,EXISTS通常比IN更快,因为它一旦找到匹配就...
此外,位图索引可以是单字段的,也可以是多个字段的组合,这使得它们能够在涉及AND或OR操作符的查询中发挥优势,通过位运算而不是比较运算提高查询速度。 在实际应用中,比如厦门市公安局信息管理系统的人员资料...
2. **位图索引的应用**:对于只存储“是”或“否”信息的字段,建议使用位图索引以节省存储空间并提高查询速度。 3. **递归查询优化**:当查询涉及多个表关联时,可以通过创建临时表并将其转化为多步操作来提高性能...
Oracle 中的索引主要包括 B 树索引和位图索引两类,其作用都是通过降低磁盘读取次数以提高查询效率。在大型数据库应用开发和管理实践中,索引的使用对查询效率有着非常重要的影响。 B 树索引对查询效率的影响 B 树...
此外,位图索引的维护操作也可以使用位逻辑运算来实现,从而大大提高了索引的维护效率。 位图索引技术非常适合应用于数据仓库中。它可以大大缩短数据检索的响应时间,减少索引的存储空间,并且维护起来非常方便。 ...
在Oracle数据库系统中,索引是一种重要的数据结构,它能够显著提升数据查询的效率。索引的使用是数据库性能优化的关键环节,尤其是在大型企业级应用中,对索引的合理设计和管理对于系统的运行速度至关重要。这篇博文...
位图索引是基于表中的一个或多个列创建的,它可以加速基于这些列的查询。 (4)索引编排表 索引编排表是一种特殊类型的索引,它可以快速查找具有相同列值的记录。索引编排表是基于表中的一个或多个列创建的,它...
本篇文章将深入探讨Oracle中的B*Tree索引、反向索引、降序索引、位图索引和函数索引。 1. **B*Tree索引**: - B*Tree索引是Oracle中最常见的索引类型,其结构类似于二叉树,可以高效地处理高基数数据列,即具有...
位图索引则适用于低基数(即不同值较少)的列,或者在进行多列组合查询时,可以将多个位图索引合并,以提高查询效率。反向键索引适用于排序顺序与键值顺序相反的情况,如主键自增的情况。 当涉及数据操作,如删除、...
在数据库管理中,索引是提升查询性能的关键要素。Oracle和SQL Server作为两种广泛应用的关系型数据库管理系统,都支持创建和管理...通过合理的设计和管理,索引能够极大地提升查询效率,进而优化整个系统的运行效率。
在Oracle数据库中,索引分为B树索引、位图索引、函数索引等多种类型,每种都有其特定的应用场景和优缺点。 二、B树索引 B树索引是最常见的索引类型,适用于全值匹配查询。在Oracle中,B树索引由一个或多个索引块...
通过实验验证和专业指导,可以有效地提高查询效率,为数据库系统的高效运行提供支持。 关键词:Oracle数据库;索引;SQL;查询优化 参考文献: [1] 高海宾,陶保壮. 基于Oracle数据库索引的查询优化研究[J]. 新余...
在Oracle中,索引是提高查询速度的关键,特别是B树索引和位图索引。B树索引适用于单列查询和范围查询,而位图索引则适合于多列组合查询或在数据稀疏的情况下。 描述中提到的博文链接可能提供了一些具体案例,但遗憾...
在Oracle中,常见的执行计划类型包括全表扫描(Full Table Scans)、索引唯一扫描(Index Unique Scans)、范围扫描(Index Range Scans)、跳跃扫描(Index Skip Scans)和位图连接(Bitmap Joins)等。每种类型的...
Oracle数据库中的索引是提升数据查询效率的关键工具,它们提供了快速访问表中特定记录的途径。索引由表中一列或多列的键值组成,这些键值存储在一个高效的结构,如B树,使得Oracle数据库能迅速定位到相关行。在本...
视图和索引是Oracle数据库中两个非常关键的概念,它们对于优化查询性能、管理数据以及提高数据安全性都至关重要。以下是对这两个概念的详细解释: 一、Oracle视图 1. 定义:视图是从一个或多个表中创建的虚拟表,它...