`
nesta2001zhang
  • 浏览: 70815 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle关于位图索引的创建与应用

阅读更多
1)创建

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

  CREATE BITMAP INDEX index_name ON normal_index_creation_clause;

  Oracle创建一系列的位图,每个位图都与一个特殊的值有关。例如,如果在某一个字段上创建一个位图索引,这个字段上的值有2种,1个是'East'1个是'Central',那没就建立有2个位图,1个用于'East'1个用于'Central'。

  如果索引建立于多个字段上,那么每种可能的组合都必须有一个位图。

  2)位图索引结构

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

  一个规则的B*tree索引是根据ROWID作为行的关键值来成对,再将这些对整理放置到B*tree结构中。ROWID作为一个指向一行的指针。位图索引有一个非常不一样的结构:ROWID并不直接存储:每个不同的值有一个它们自己的位图。(这就是为什么位图索引通常建立在独特值较少的列上)。

  位图的每个位置映射到一个可能的ROWID上,位图上每个位置的内容用于表示该行特定的值是否在位图列中。所以,位图的每个位置存储特殊行和相关ROWID的信息。如果该ROWID的行的值匹配,则该特殊rowid位置存储为"1",否则储存为"0"。Oracle也能够压缩位图存储。

  3)何时使用位图索引

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

  - 该字段具有较低的集的势:独特值较少

  - 位图索引在具有冗长WHERE条件的复杂查询或聚合查询(包含SUM,COUNT或其他聚合函数)中特别有帮助。

  - 表中有大量的行(100万行有1万个独特值可以接收使用位图索引)

  - 表上有频繁复杂查询

  - 数据库环境为数据仓库(DSS系统)。由于位图索引的加锁形式,所以它不大适合联机事务处理(OLTP)环境。不能单独锁定位图的其中一个位置。

  位图被锁定的最小数量为1个位图段,它可以达到半个数据块的大小。改变一行的值将会导致整个位图段被锁,同时锁住了其他的行。

  这对于用户如果有大量的UPDATE,INSERT,DELETE语句及其不利。但对于数据是批量导入或更新则没有问题,如在一个数据仓库系统中。

  - 位图连接索引是9i引入的一个新方法,可以避免在运行时的连接操作,因为在索引创建时位图索引已经基于了连接。

  BJI是一个在空间上减少选择数据量的有效方法。这些数据导致的连接操作和限制都永久地存储在BJI中。连接条件是一个相对的内部连接,维度表的主键和事实表的外键。

  4)限制条件

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

  - 位图索引在Trusted Oracle中不支持

  - 不能被规则优化器(RBO)使用

  - 不能用于分区表的全局索引

  - 位图索引不支持build或rebuild的ONLINE选项,在10.2中,只有位图连接索引不支持,普通位图索引可以指定ONLINE选项。

  - 对于有直接装载的位图索引,不提供SORTED_INDEX标记

  - 位图索引不能用于完整性检查

  - 位图索引不能定义为UNIQUE

  - 9i之前,不能在索引组织表上创建位图索引,9i开始支持在索引组织表上创建位图索引:在IOT上创建位图索引要求有一个映射表。

  - 不能给域索引指定BITMAP

  5)相对B*tree索引的优势

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

  - 在大量复杂查询中节省响应时间

  - 对于常规的B*tree索引,有效地节省了空间使用

  a)在某一个字段上只有少量的独特值:

  如果在一个具有唯一性的字段上建立位图索引,那么它要求的空间大大超过B*tree索引。然而,对于每个值都重复了成百上千次,位图索引通常小于常规B*tree索引的25%。位图自身采用压缩格式存储。

  b)如果多个列被索引

  相对于多列(或连接)的B*tree索引,位图索引节约了相当可观的存储。在一个只有B*tree索引的数据库中,必须要预先评估在当个查询中可能访问到的列,然后在这些列上创建组合索引。

  这类索引不仅需要大量的空间,而且要求要有一定的顺序,如一个B*tree索引建立在(MARITAL_STATUS,REGION,GENDER)字段上,查询只访问REGION,GENDER时,索引是不起效果的。为了在数据库中充分地使用索引,必须在这些列上变换另一种排列顺序建立索引。举个简单例子,在一个较低的集的势的3个列中,那么可能就存在有6种位置关系不同的组合索引。需要在磁盘空间和性能之前权衡考虑创建何种位置顺序的索引。位图索引解决了这个进退两难问题。位图索引在查询执行过程中可以有效地组合,所以3个较小的单个字段的位图索引可以完成6种3个字段组合的B*tree索引的工作。

  - 非常高效的并行DML和装载

  位图索引在数据仓库应用中很有效率,但是不适合在OLTP应用系统中使用,因为有大量同时发生的INSERT,UPDATE,DELETE操作。索引直到每个DML操作完成之后才进行维护。例如,如果插入1000行数据,插入的行将放置在排序缓冲区中,然后更新批量更新所有的1000条索引条目。(这就是为什么SORT_AREA_SIZE需要设置为一个较优性能的值,用于位图索引的插入和更新)。所以,每个DML操作,位图段只更新一次,即使段中有多行变更时。

  - 行包含null值(见"位图索引和NULLs")

  6)使用小贴士

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

  - 在所有可能非空的字段上声明NOT NULL约束,可以减少存储需求,因为位图不会有NULL值。

  - 使用固定长度的数据格式可以减少存储需求。

  - 增大CREATE_BITMAP_AREA_SIZE初始化参数,可以加快查询处理

  该参数决定了分配给位图创建的内存大小,默认值为8MB。更大的值可以支持更大的连续位图,所以可以较快查询处理。

  - 增大BITMAP_MERGE_AREA_SIZE初始化参数可以加快索引的范围扫描。该参数决定了索引范围扫描时合并位图分配的内存大小。默认值为1MB。

  7)位图索引示例

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

  1个公司的客户数据

  CUSTOMER#   MARITAL_STATUS   REGION   GENDER  INCOME_LEVEL

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

  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

  MARITAL_STATUS,REGION,GENDER,INCOME_LEVEL字段都是有较少的独特值(婚姻状况和地域只有三种值,性别只有2种值,收入级别只有4种值),较为适合在这些字段上创建位图索引。但在CUSTOMER#上不适合创建位图索引,因为该字段独特值较多。

  相反,在该字段上创建一个唯一的B*tree索引,将十分有效。

  本例中,REGION字段上的位图索引。

  由三个分开的位图组成,每个region一个。

  REGION='east'  REGION='central'  REGION='west'  ##       CUSTOMER#

  1              0                 0              <==       101

  0              1                 0              <==       102

  0              0                 1              <==       103

  0              0                 1              <==       104

  0              1                 0              <==       105

  0              1                 0              <==       106

  位图中的每个条目(或是说"bit")对应CUSTOMER表中的每一行。每个bit的值依赖于表中相应行的值。例如,REGION='east'的位图,它的第一个bit为1。这是因为CUSTOMER表的第一行,REGION='east'。REGION='east'的位图其他bit为0,是因为该表的其他行的REGION字段为其他值。

  一个分析员调查该公司客户的人口趋势,可能会问:"居住在中心区或西区的客户有多少是已婚的?",该问题就是下面这个查询SQL:

  SELECT COUNT(*) FROM CUSTOMER

  WHERE MARITAL_STATUS = 'married' AND REGION IN ('central','west');

  位图索引可以很高效地完成查询,因为只要计算位图中结果为1的数量,如图所示。最后要确认哪些客户符合要求,只要通过位图结果去访问表就可以了。

  status = 'married'     region = 'central'    region = 'west'

  0                          0                   0

  1                          1                   0

  1                          0                   1

  0                 AND(     0           OR      1       )

  0                          1                   0

  1                          1                   0

  0                           0              0

  1                           1              1    ==> 2nd row

  = 1                           1              1    ==> 3rd row

  0                 AND       1            = 0

  0                           1              0

  1                           1              1    ==> last row

  8)位图索引和NULLs

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

  位图索引包含的行有NULL值,和其他类型的索引完全不相同。对null值索引有利于一些类型的SQL语句,如查询包含了聚合函数COUNT。

  例1:

  -------

  SELECT COUNT(*) FROM EMP;

  任何一个位图索引都可以用于该查询,因为表中所有行都被索引,包括那些NULL数据。如果null值未编入索引,优化器只有当,某个字段上有NOT NULL约束时,使用这个字段的索引。

  例2:

  -------

  SELECT COUNT(*) FROM EMP WHERE COMM IS NULL;

  该查询可以通过在COMM上建立一个位图索引来优化。

  例3:

  -------

  SELECT COUNT(*) FROM CUSTOMER WHERE GENDER = 'M' AND STATE != 'CA';

  该查询可以通过GENDER = 'M'的位图减去STATE = 'CA'的位图来得到结果。如果STATE字段包含NULL值(也就是说,该字段上没有NOT NULL约束),那么STATE = 'NULL'的位图也必须从该结果中减去。

  9)表和视图

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

  通过TYPE='BITMAP'条件,可以在USER_INDEXES,ALL_INDEXES,DBA_INDEXES视图中查询到位图索引的信息。

  10)执行计划上的标签

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

  参看:

  Oracle8 Tuning Release 8.0

  Oracle8i Tuning Release 8.1.5

  Oracle9i Database Performance Tuning Guide and Reference Release 1 (9.0.1)

  Oracle9i Database Performance Tuning Guide and Reference Release 2 (9.2)

  Oracle Database Performance Tuning Guide and Reference 10gRelease 1 (10.1)

  Oracle Database Performance Tuning Guide and Reference 10gRelease 2 (10.2)

  Chapter Using EXPLAIN PLAN

  11)使用位图索引的HINT(7.3 - 8.0 - 8.1 - 9.0 - 9.2 - 10.1 - 10.2)

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

  INDEX

  INDEX_COMBINE

  12)初始化参数

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

  <Parameter:CREATE_BITMAP_AREA_SIZE>

  <Parameter:BITMAP_MERGE_AREA_SIZE>

  <Parameter:B_TREE_BITMAP_PLANS>

  <Parameter:V733_PLANS_ENABLED>
分享到:
评论

相关推荐

    位图索引在ORACLE中的应用.pdf

    综上所述,位图索引在Oracle数据库中的应用能够有效优化低基数字段的查询性能,减少存储需求,特别是在需要高效处理复杂查询和统计分析的场景下。通过合理地结合使用B树索引和位图索引,可以平衡查询速度和存储成本...

    oracle、sql数据库批量建索引

    Oracle和SQL Server作为两种广泛应用的关系型数据库管理系统,都支持创建和管理索引以优化查询速度。本文将深入探讨这两个数据库系统中如何批量创建和删除索引,以及它们对系统运行效率的影响。 首先,让我们了解...

    oracle约束和索引笔记

    - **位图索引(Bitmap Index)**: 适合于在含有大量重复值的列上,尤其是在进行多列组合查询时,将多个位图索引合并进行快速查找。 - **函数索引(Function-Based Index)**: 允许基于函数的结果创建索引,使得对...

    oracle实验9-10-索引与视图-序列和同义词的创建.doc

    本实验中,我们将创建唯一的 B 树索引、普通的 B 树索引和位图索引。 二、视图的概念和优点 视图是数据库中的一种虚拟表,它是基于基本表的查询结果。视图可以简化复杂的查询、提高查询效率和保护数据安全。本实验...

    Oracle培训 关于索引等详细信息的讲解

    在Oracle数据库中,索引分为B树索引、位图索引、函数索引等多种类型,每种都有其特定的应用场景和优缺点。 二、B树索引 B树索引是最常见的索引类型,适用于全值匹配查询。在Oracle中,B树索引由一个或多个索引块...

    oracle中索引的使用

    这篇博文将深入探讨Oracle中索引的基本概念、类型、创建与管理,以及如何通过索引来优化查询性能。 首先,我们来理解什么是索引。索引就像是书的目录,当我们需要查找某个特定的信息时,通过目录可以直接定位到相应...

    oracle创建表,索引,表空间,触发器,schema用户,序列的Sql文

    Oracle支持B树索引、位图索引等多种类型。例如,为EmployeeID创建索引: ```sql CREATE INDEX idx_employee_id ON Employees(EmployeeID); ``` 这条语句创建了一个名为idx_employee_id的索引,基于Employees表的...

    oracle分区与索引

    - **位图索引**:适合于包含大量重复值的列,尤其是在进行大量选择操作时非常有效。 - **散列索引**:适用于简单的等值查询。 - **全局索引分区**:与分区表关联的索引,支持跨分区的查询。 - **局部索引分区**:仅...

    ORACLE索引详解及SQL优化

    Oracle支持多种类型的索引,包括B树索引、位图索引、函数索引和唯一索引等。其中,B树索引是最常见的一种,它通过分层结构快速定位数据行。位图索引则适合于低基数(即某个字段值较少)的列,通过位图方式存储,节省...

    oracle 视图、索引(自用)

    1. 索引创建:使用CREATE INDEX语句创建索引,根据需求选择合适的索引类型。 2. 索引重建:当表结构改变或索引碎片过多时,可以重建索引来优化性能。 3. 索引监控:通过性能监控工具检查索引使用情况,判断是否需要...

    oracle索引,常见索引问题

    常见的索引类型包括B*树索引和位图索引,每种都有其特定的应用场景和优势。 1. **B*树索引**:这是最常见的索引类型,类似于二叉树结构,能高效地根据键值进行查找。B*树索引有以下几种子类型: - **索引组织表...

    Oracle Index 索引介绍

    ### 二、索引创建与维护 创建索引通常使用`CREATE INDEX`语句,例如: ```sql CREATE INDEX idx_employee_name ON employees(last_name); ``` 索引的维护包括更新、删除和重建。当数据表中的数据发生变化时,索引...

    Oracle 索引

    Oracle提供了多种类型的索引,包括B树索引、位图索引、函数索引、唯一索引和复合索引等,每种都有其独特的应用场景和优缺点。 1. **B树索引**:这是最常见的索引类型,适用于频繁的查询操作。B树索引通过排序的数据...

    Oracle索引优化

    在Oracle数据库中,索引的种类繁多,包括B*Tree索引、反向索引、降序索引、位图索引和函数索引等。理解并正确使用这些索引类型对于提升查询性能至关重要。 首先,B*Tree索引是最常见的索引类型,适用于大部分常规...

    Oracle数据库中的索引管理技术.pdf

    Oracle 8i 支持几种不同类型的索引以满足许多类型的应用程序的需求,其中包括 B-树(标准)索引、反向键索引、位图索引、索引编排表和基于函数的索引。这些索引都是基于表列创建的各种类型的索引。 (1)标准(B-树...

    合理创建和使用索引 提高Oracle查询效率.pdf

    位图索引是一种特殊的索引类型,通常用于对只有少数几个值的字段创建索引。位图索引可以大大提高查询效率,因为它可以快速地确定哪些记录满足查询条件。 在创建索引时,需要考虑到表的结构、字段的分布情况和查询的...

    oracle索引类型及扫描方式大整理new

    位图索引通过压缩技术,将大量的行标识符存储在一个紧凑的位图中,极大地节省了存储空间,同时在进行大量聚合操作时,位图索引能够快速识别出哪些行满足查询条件,从而大幅提升查询性能。 #### 五、函数索引:计算...

    Oracle数据库索引的维护

    此外,还有其他类型的索引如位图索引、散列索引等,但B树索引因其高效性而被广泛使用。 #### 二、索引结构与存储 1. **块(Block)**:这是数据库中最基本的存储单元,Oracle数据库中的每个块都有固定的大小,这个...

    高效ORACLE之索引(完整).pdf

    函数索引(Function-Based Index,简称FBI):函数索引允许在索引创建时应用函数,即索引基于函数计算的结果而不是原始列值。这种索引适用于那些需要在查询中频繁使用表达式的情况,通过预计算表达式的值并建立...

Global site tag (gtag.js) - Google Analytics