`

Oracle索引原理篇

阅读更多
Oracle提供了大量索引选项。知道在给定条件下使用哪个选项对于一个应用程序的性能来说非常重要。一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程终止。而如果做出正确的选择,则可以合理使用资源,使那些已经运行了几个小时甚至几天的进程在几分钟得以完成,这样会使您立刻成为一位英雄。这篇文章就将简单的讨论每个索引选项。主要有以下内容:
  
  [1] 基本的索引概念
  
  查询DBA_INDEXES视图可得到表中所有索引的列表,注意只能通过USER_INDEXES的方法来检索模式(schema)的索引。访问USER_IND_COLUMNS视图可得到一个给定表中被索引的特定列。
  
  [2] 组合索引
  
  当某个索引包含有多个已索引的列时,称这个索引为组合(concatented)索引。在 Oracle9i引入跳跃式扫描的索引访问方法之前,查询只能在有限条件下使用该索引。比如:表emp有一个组合索引键,该索引包含了empno、ename和deptno。在Oracle9i之前除非在where之句中对第一列(empno)指定一个值,否则就不能使用这个索引键进行一次范围扫描。
  
  特别注意:在Oracle9i之前,只有在使用到索引的前导索引时才可以使用组合索引!
  
  [3] ORACLE ROWID
  
  通过每个行的ROWID,索引Oracle提供了访问单行数据的能力。ROWID其实就是直接指向单独行的线路图。如果想检查重复值或是其他对ROWID本身的引用,可以在任何表中使用和指定rowid列。
  
  [4] 限制索引
  
  限制索引是一些没有经验的开发人员经常犯的错误之一。在SQL中有很多陷阱会使一些索引无法使用。下面讨论一些常见的问题:
  
  4.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条件,就可以使用索引,以避免全表扫描。
  
  4.2 使用IS NULL 或IS NOT NULL
  
  使用IS NULL 或IS NOT NULL同样会限制索引的使用。因为NULL值并没有被定义。在SQL语句中使用NULL会有很多的麻烦。因此建议开   发人员在建表时,把需要索引的列设成NOT NULL。如果被索引的列在某些行中存在NULL值,就不会使用这个索引(除非索引是一个位图索   引,关于位图索引在稍后在详细讨论)。
  
  4.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.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_number ='990354';
  
  特别注意:不匹配的数据类型之间比较会让Oracle自动限制索引的使用,即便对这个查询执行Explain Plan也不能让您明白为什么做了一        次“全表扫描”。
  
  [5] 选择性
  
  使用USER_INDEXES视图,该视图中显示了一个distinct_keys列。比较一下唯一键的数量和表中的行数,就可以判断索引的选择性。选择性越高,索引返回的数据就越少。
  
  [6] 群集因子(Clustering Factor)
  
  Clustering Factor位于USER_INDEXES视图中。该列反映了数据相对于已索引的列是否显得有序。如果Clustering Factor列的值接近于索引中的树叶块(leaf block)的数目,表中的数据就越有序。如果它的值接近于表中的行数,则表中的数据就不是很有序。
  
  [7] 二元高度(Binary height)
  
  索引的二元高度对把ROWID返回给用户进程时所要求的I/O量起到关键作用。在对一个索引进行分析后,可以通过查询DBA_INDEXES的B-level列查看它的二元高度。二元高度主要随着表的大小以及被索引的列中值的范围的狭窄程度而变化。索引上如果有大量被删除的行,它的二元高度也会增加。更新索引列也类似于删除操作,因为它增加了已删除键的数目。重建索引可能会降低二元高度。
  
  [8] 快速全局扫描
  
  在Oracle7.3后就可以使用快速全局扫描(Fast Full Scan)这个选项。这个选项允许Oracle执行一个全局索引扫描操作。快速全局扫描读取B-树索引上所有树叶块。初始化文件中的DB_FILE_MULTIBLOCK_READ_COUNT参数可以控制同时被读取的块的数目。
  
  [9] 跳跃式扫描
  
  从Oracle9i开始,索引跳跃式扫描特性可以允许优化器使用组合索引,即便索引的前导列没有出现在WHERE子句中。索引跳跃式扫描比全索引扫描要快的多。下面的程序清单显示出性能的差别:
  
  create index skip1 on emp5(job,empno);
  index created.
  
  select count(*)
  from emp5
  where empno=7900;
  
  Elapsed:00:00:03.13
  
  Execution Plan
  0   SELECT STATEMENT Optimizer=CHOOSE(Cost=4 Card=1 Bytes=5)
  1 0  SORT(AGGREGATE)
  2 1   INDEX(FAST FULL SCAN) OF 'SKIP1'(NON-UNIQUE)
  
  Statistics
  
  6826 consistent gets
  6819 physical  reads
  
  select /*+ index(emp5 skip1)*/ count(*)
  from emp5
  where empno=7900;
  
  Elapsed:00:00:00.56
  
  Execution Plan
  0   SELECT STATEMENT Optimizer=CHOOSE(Cost=6 Card=1 Bytes=5)
  1 0  SORT(AGGREGATE)
  2 1   INDEX(SKIP SCAN) OF 'SKIP1'(NON-UNIQUE)
  
  Statistics
  
  21 consistent gets
  17 physical  reads
  
  [10] 索引的类型
  B-树索引
  位图索引
  HASH索引
  索引编排表
  反转键索引
  基于函数的索引
  分区索引
  本地和全局索引


=================

避免全表扫描,,,
分享到:
评论

相关推荐

    Oracle索引优化相关

    Oracle数据库经典优化之索引原理篇 Oracle中建立索引并强制优化器 基于索引的SQL语句优化之降龙十八掌 30个Oracle语句优化规则详解-性能调优

    Oracle数据库经典优化之索引原理篇

    Oracle提供了大量索引选项。知道在给定条件下使用哪个选项对于一个应用程序的性能来说非常重要。本文简单的讨论每个索引选项。

    oracle索引分析说明

    详细介绍oracle数据库索引使用情况,索引存储原理

    oracle数据库DBA专题技术精粹.zip

    本书从DBA的角度阐述了...性能篇深入分析了Statspack等常用的调整工具的原理与使用方法、判断依据,并从锁、内存、索引、执行计划等各个角度介绍了各种优化技巧;网络篇主要介绍了监听器、透明网关、数据迁移等方面的

    Oracle DBA突击帮你赢得一份DBA职位(完全高清版)1

    第5章至第9章是中级篇,专门讨论性能调整,包括性能优化原理、Oracle性能调整发展历程、AWR、ASH、ADDM、Auto SQL Tunning等最新的助手工具,并通过大量实例展示技术的综合应用。第10章至第13章是高级篇,主要面向...

    收获不知Oracle

    上篇 开启惊喜之门——带意识地学Oracle 第1章意识,少做事从学习开始 2 1.1 选择先学什么颇有学问 2 1.1.1 梁老师课堂爆笑开场 2 1.1.2 看似跑题的手机分类 4 1.1.3 学什么先了解做什么 5 1.2 善于规划分类才有...

    浅谈数据库索引的作用及原理

    主要介绍了浅谈数据库索引的作用及原理的相关内容,涉及索引加速和加索引的时间等,希望通过这篇文章让大家对索引有一个初步的了解,需要的朋友可以参考下。

    程序员的SQL金典.rar

     10.1.1 SQL注入漏洞原理  10.1.2 过滤敏感字符  10.1.3 使用参数化SQL  10.2 SQL调优  10.2.1 SQL调优的基本原则  10.2.2 索引  10.2.3 全表扫描和索引查找  10.2.4 优化手法  10.3 事务  10.3.1 事务...

    php网络开发完全手册

    13.3.2 ORACLE 207 13.3.3 SYBASE 207 13.3.4 DB2 207 13.3.5 SQL Server 207 13.4 SQL语言简介 207 13.5 常见的数据库设计问题 208 13.6 关系型数据库的设计原则 209 13.6.1 第一范式(1NF) 209 13.6.2 第二范式...

    asp.net知识库

    如何在.NET中实现脚本引擎 (CodeDom篇) .NET的插件机制的简单实现 我对J2EE和.NET的一点理解 难分难舍的DSO(一) InternalsVisibleToAttribute,友元程序集访问属性 Essential .NET 读书笔记 [第一部分] ...

    Jive资料集

    3 Jive Forums KB数据库说明(中文) 4 Jive Forums KB合并数据库脚本(MSSQL) 5 Jive Forums KB合并数据库脚本(Oracle) 6 Jive Forums KB合并数据库脚本(MySql) 7 使用XML封装数据库操作语句...

    精通qt4编程(源代码)

    \3.3.1 基本原理 53 \3.3.2 设计信号和槽 55 \3.3.3 信号和槽的自动关联 62 \3.4 窗口标志及几何布局 63 \3.4.1窗口标志 64 \3.4.2窗口部件的几何布局 66 \ \3.5 Qt样式表 74 \3.5.1 样式表语法 74 \3.5.2 样式表的...

    精通Qt4编程(第二版)源代码

    \3.3.1 基本原理 53 \3.3.2 设计信号和槽 55 \3.3.3 信号和槽的自动关联 62 \3.4 窗口标志及几何布局 63 \3.4.1窗口标志 64 \3.4.2窗口部件的几何布局 66 \ \3.5 Qt样式表 74 \3.5.1 样式表语法 74 \3.5.2 ...

    jive.chm

    2 关于Jive2中的中文搜索 3 基于JAVA的全文索引引擎Lucene简介 &lt;br&gt; 安全认证 1 Jive2.1.1 License保护原理分析 2 用Java的加密机制来保护你的数据 3 在java中编程实现数字签名系统...

    亮剑.NET深入体验与实战精要2

    8.1.3 Ajax的工作原理 326 8.1.4 Ajax的优点 326 8.1.5 Ajax的问题 327 8.1.6 Ajax适用场景 327 8.1.7 Ajax不适用场景 329 8.1.8 XMLHttpRequest开发实例 329 8.2 微软VS.NET的Ajax开发 333 8.2.1 安装ASP.NET 2.0 ...

Global site tag (gtag.js) - Google Analytics