`
benqend
  • 浏览: 32994 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

oracle索引的简单总结

阅读更多
一、索引的概念:
    数据库的索引类似于书籍的索引。在书籍中,索引允许用户不必翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数据,而不必扫描整个数据库。
二、索引的特点:
    1.索引可以加快数据库的检索速度
    2.索引降低了数据库插入、修改、删除等维护任务的速度
三、oracle索引的类型:
b*树索引:
    这是Oracle中最常用的索引,它的构造类似于二叉树,能根据键提供一行或一个行集的快速访问,通常只需要很少的读操作就能找到正确的行。B*树索引由两列组成,第一列是ROWID, 它是行的位置(它指向了数据库表中对应的此行的位置);第二列是正被索引列的值(具体的被建立了索引的列的值,我们先是根据
这个值通过导航块找到这个叶子节点的该项(值,rowid),然后通过rowid找到具体的这行记录)。


             图:典型的B*树索引布局
    这个树底层的块称为叶子节点/叶子块,其中分别包含各个索引键值以及一个rowid(它是指向所索引的行)。叶子节点之上的内部块称为分支块(branch block)/导航块,这些节点用于实现导航。例如,如果想在索引中找到值20,要从树顶开始,找到左分支,我们检查这个块,并发现需要找到范围"20..25"的块,这个块将是叶子块,其中会指示包含数20的行。索引的叶子节点实际上构成了一个双向链表。一旦发现要从叶子节点中的哪里开始,执行值的有序扫描就会很容易,我们就不必再在索引结构中导航,而只需根据叶子节点向前或向后扫描就可以了(比如要做between 20 to 40,我们只需要先导航找到20,然后顺序扫描直到遇到40即可)。
    B*树的特点之一是:所有叶子块都应该在树的同一层上,这一层称之为索引的高度, 它说明所有从索引的根块到叶子块的遍历都会访问同样数目的块。由此可见B*树的B代表的是balanced,所谓的"Height balanced"。大多数B*树索引的高度都是2或3,即使索引中有数百万行记录也是如此,这说明,一般而言,在索引中找到一个键只需要2到3次I/O , 这确实不错。
    B*树是一个极佳的通用索引机制,无论是大表还是小表都很适用,随着底层表大小增长,获取数据的性能仅会稍有恶化。
比如,我们为customers表建立一个常见的B*树索引: 
   CREATE INDEX IDX_Cus_City on customers(city)
b*树子索引---复合索引
    复合索引也是一种B*树索引,它由多列组成。当我们拥有使用两列或超过两列的频繁查询时,就使用B*树复合索引,而其所使用的两列或多列在where子句中and逻辑操作符连接。因为复合索引中列的顺序很重要,所以确信以最有效的索引顺序排列他们,前导列应该是基数大的列(不同的取值多)。而且单独的where也会使用此索引,而后序列则必须与前导一起使用。
反向索引:
    Oracle推出它的主要目的就是为了降低在并行服务器(Oracle Parallel Server)环境下索引叶块的争用。当B*Tree索引中列是由递增的序列号产生的话,那么这些索引信息基本上分布在同一个叶块,当用户修改或访问相似的列时,索引块很容易产生争用。反向索引中的索引码将会被分布到各个索引块中,减少了争用。反向索引反转了索引码中每列的字节,使得它们不会分到一个叶子块中,但是反向索引也因此不能应用于范围搜索,因为它的相邻叶子块是无顺序的。
    CREATE INDEX index_name on table_name(column_name) REVERSE ;
降序索引:
    降序索引是oracle 8i引入的,用以扩展B*树索引的功能,它允许在索引中以降序(从大到小的顺序)存储一列。对于降序的order by有效。
位图索引:
    当我们需要根据基数比较小的列进行查询时,一般使用位图索引会对查询效率有明显提高,如查询性别是女,已婚,汉族的人。(性别,婚否,民族基数都比较小)
    CREATE BITMAP INDEX index_name ON table_name(column_name1,column_name2) TABLESPACE tablespace_name
函数索引:
    B*Tree的衍生产物,应用于查询语句条件列上包含函数的情况,索引中储存了经过函数计算的索引码值。可以在不修改应用程序的基础上能提高查询效率。
五、建立合适的索引:
1、最简单的情形:
   如果你在查询时常用类似以下的语句 + 表的记录比较多 + category_id基数比较大(不重复记录数)
   SELECT * FROM mytable WHERE category_id=1;
   最直接的应对之道,是为category_id建立一个简单的索引:
  CREATE INDEX mytable_categoryid ON mytable (category_id);
2、如果你有不止一个选择条件,例如:
  SELECT * FROM mytable WHERE category_id=1 AND user_id=2;
   你可以建立复合索引。
   CREATE INDEX mytable_categoryid_userid ON mytable (category_id,user_id);
3、如果有个ORDER BY子句,那么我们就为这个ORDER BY字段建立一个索引
   如果是降序的,我们可以建立降序索引,否则建立普通索引。
4、在基数小的字段上要善于使用位图索引。
   如在员工信息表中的性别字段,一般就只有男跟女两个值,所以,其基数为2;婚姻状况字段的话,则其只有已婚、未婚、离婚三种状态,其基数就为3;民族一览内也是只有有限的几个值。
5、需要利用Join语句连接多个表时,把这些表格关联起来。为了提高数据库的查询效率,这些用来关联的字段,最好能够建立索引。这可以显著的提高查询的速度。

六、索引的屏蔽:
在SQL中有很多陷阱会使一些索引无法使用。下面讨论一些常见的问题:
1、 使用不等于操作符(<>、!=)
下面的查询即使在cust_rating列有一个索引,查询语句仍然执行一次全表扫描。
    select cust_Id,cust_name
    from   customers
    where  cust_rating <> 'aa';
把上面的语句改成如下的查询语句,这样将会使用索引。
    select cust_Id,cust_name
    from   customers
    where  cust_rating < 'aa' or cust_rating > 'aa';
特别注意:通过把不等于操作符改成OR条件,就可以使用索引,以避免全表扫描。
2、 使用IS NULL 或IS NOT NULL
    使用IS NULL 或IS NOT NULL同样会限制索引的使用。因为NULL值并没有被定义。在SQL语句中使用NULL会有很多的麻烦。因此建议开发人员在建表时,把需要索引的列设成NOT NULL。如果被索引的列在某些行中存在NULL值,就不会使用这个索引(除非索引是一个位图索引)。
3、 使用函数
    如果不使用基于函数的索引,那么在SQL语句的WHERE子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。
下面的查询不会使用索引(只要它不是基于函数的索引)
    select empno,ename,deptno
    from   emp
    where  trunc(hiredate)='01-MAY-81';
    把上面的语句改成下面的语句,这样就可以通过索引进行查找。
    select empno,ename,deptno
    from   emp
    where  hiredate<(to_date('01-MAY-81')+0.9999);
4、 比较不匹配的数据类型
    比较不匹配的数据类型也是比较难于发现的性能问题之一。注意下面查询的例子,account_number是一个VARCHAR2类型,在account_number字段上有索引。下面的语句将执行全表扫描。
    select bank_name,address,city,state,zip
    from   banks
    where  account_number = 990354;
    Oracle可以自动把where子句变成to_number(account_number)=990354,这样就限制了索引的使用,改成下面的查询就可以使用索引:
    select bank_name,address,city,state,zip
    from   banks
    where  account_n
分享到:
评论

相关推荐

    oracle索引机制分析

    ### Oracle索引机制分析 #### 1. 基本索引概念 索引是数据库管理系统(DBMS)为了加快数据检索速度而采用的一种数据结构。Oracle提供了多种类型的索引,每种索引都有其特定的优势和适用场景。索引的基本目的是通过...

    Oracle解决索引碎片功能.txt

    ### Oracle解决索引碎片功能详解 #### 索引碎片概念 ...使用`ALTER INDEX`命令进行索引重建是一种简单而有效的解决方法。在执行重建操作时,应注意选择合适的时间窗口,并确保有足够的资源支持操作顺利完成。

    Oracle重构索引

    #### 一、Oracle索引重构概述 在日常的数据库维护工作中,我们可能会遇到数据库中的索引变得杂乱无章的情况。这种情况可能会导致查询性能下降,因此对索引进行重构是非常必要的。Oracle提供了多种方法来帮助我们...

    Oracle索引的一点探究

    总结来说,Oracle索引对于提高特定列的查询性能至关重要。然而,它并不会自动提升所有查询的速度,尤其是当查询涉及未索引的列或者复杂的组合条件时。因此,明智地设计和使用索引是优化数据库性能的关键。同时,理解...

    oracle 基础知识总结初学者必备

    ### Oracle基础知识总结初学者必备 Oracle数据库作为一款广泛使用的数据库管理系统,在企业和开发领域扮演着重要的角色。对于初学者而言,掌握其基础知识是非常必要的。本文将根据提供的内容进行深入解析,并结合...

    oracle dba 面试题总结

    本文将从 SQL 调优、执行计划、索引、绑定变量、执行计划稳定性、排序相关内存等方面对 Oracle DBA 面试题进行总结和解释。 一、SQL 调优 SQL 调优是 Oracle DBA 的核心任务之一。如何查看 SQL 的执行计划是 DBA ...

    oracle索引介绍

    这种索引简单易用,适用于大部分查询场景。 - **组合索引**:也称为复合索引或多列索引,它是在多个列上建立的索引。组合索引能够提高多列查询的效率,尤其是在联接操作中。 #### 特点分析 1. **Oracle成本基础...

    oracle性能优化总结文档

    4. **高速缓冲(Cache Buffering)**:Oracle对简单表的查询结果进行高速缓存,但这不适用于复杂的多表连接。数据库管理员需要调整init.ora文件中的相关参数,以适应不同场景下的内存需求。更大的共享池可以存储更多...

    Oracle执行计划不走索引的原因总结

    在Oracle数据库中,执行计划不走索引是一个常见的性能问题,这可能会导致查询效率降低,尤其是在处理大量数据时。以下是一些可能导致Oracle执行计划不选择使用索引的原因及其解决策略。 1. **优化器模式设置**:...

    Oracle复制表数据的两种用法

    Oracle数据库是世界上最流行的数据库...总结来说,Oracle复制表数据的方法多样,从简单的SQL语句到复杂的复制服务,可以根据业务需求灵活选择。理解和掌握这些方法对于任何Oracle数据库管理员或开发者都是至关重要的。

    Oracle经典面试总结-去重-附答案.pdf

    本文档总结了 Oracle 数据库相关的面试问题和答案,涵盖了 optimizer_mode、CBO、RBO、索引、排序、表空间、回滚段、绑定变量、SQL 优化等多个方面的知识点。 _optimizer_mode_ Optimizer_mode 是 Oracle 数据库中...

    oracle语句经验总结

    Oracle语句经验总结主要涉及了Oracle数据库的基本操作和SQL语句的使用,下面将详细解析这些知识点。 1. 创建数据库:Oracle中创建数据库的过程相对复杂,通常需要通过Oracle Database Configuration Assistant ...

    oracle的总结 很详细的 基础也有

    Oracle数据库的强大还体现在其丰富的索引策略、事务管理、视图、存储过程、触发器等高级特性,这些都是数据库管理员和开发人员必备的知识。 总的来说,Oracle数据库的管理和使用涉及到许多层面,从基础的安装配置到...

    oracle性能优化总结

    Oracle数据库性能优化是一个复杂且关键的任务,它涉及到多个层面,包括SQL语句的编写、查询优化、索引策略以及系统参数调整等。以下是对标题和描述中提到的一些关键知识点的详细解释: 1. **SQL语句规范**:使用...

    ORACLE数据库学习总结.pdf

    以下是对Oracle数据库的详细学习总结: 一、ORACLE_简介 Oracle数据库的发展历程表明其不断适应技术变革。Oracle 8引入了对Internet的支持,Oracle 9i强化了网格计算的概念,Oracle 10g进一步提升了网格技术,而...

    oracle海量查询总结.rar

    1. 索引优化:Oracle支持多种类型的索引,如B树索引、位图索引、函数索引等。合理使用索引可以显著提升查询速度。但是,过度依赖索引也可能导致写操作性能下降,因此需权衡利弊。 2. SQL执行计划:理解执行计划是...

    oracle 性能优化总结

    - ORACLE在执行SQL语句时会涉及多项内部操作(如SQL解析、索引使用评估、变量绑定等)。减少这些操作有助于提升整体性能。 5. **调整ARRAYSIZE参数**: - 在SQL*Plus、SQL*Forms和Pro*C等工具中适当增加ARRAYSIZE...

    ORACLE数据库学习总结

    ### ORACLE数据库学习总结 #### 一、数据库简介与安装 **1、Oracle与SQL Server比较的优点:** - **跨平台支持:** Oracle支持多种操作系统平台,如Windows、Linux、Unix等,而SQL Server主要支持Windows系统。这...

    详解Oracle数据库中文全文索引

    ### 详解Oracle数据库中文全文索引 Oracle数据库的全文检索技术已经非常成熟和完善,其中Oracle Text使得Oracle 9i具备了强大的文本检索能力和智能化的文本管理能力。在不同的Oracle版本中,这一技术有着不同的名称...

Global site tag (gtag.js) - Google Analytics