知识大全 Index of Oracle

Posted 索引

篇首语:知识是珍贵宝石的结晶,文化是宝石放出来的光泽。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Index of Oracle相关的知识,希望对你有一定的参考价值。

Index of Oracle  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  索引( Index )是常见的数据库对象 它的设置好坏 使用是否得当 极大地影响数据库应用程序和Database 的性能 虽然有许多资料讲索引的用法 DBA 和 Developer 们也经常与它打交道 但笔者发现 还是有不少的人对它存在误解 因此针对使用中的常见问题 讲三个问题 此文所有示例所用的数据库是 Oracle OPS on HP N series 示例全部是真实数据 读者不需要注意具体的数据大小 而应注意在使用不同的方法后 数据的比较 本文所讲基本都是陈词滥调 但是笔者试图通过实际的例子 来真正让您明白事情的关键    一讲 索引并非总是最佳选择   如果发现Oracle 在有索引的情况下 没有使用索引 这并不是Oracle 的优化器出错 在有些情况下 Oracle 确实会选择全表扫描(Full Table Scan) 而非索引扫描(Index Scan) 这些情况通常有    表未做statistics 或者 statistics 陈旧 导致 Oracle 判断失误 根据该表拥有的记录数和数据块数 实际上全表扫描要比索引扫描更快   对第 种情况 最常见的例子 是以下这句sql 语句   select count(*) from mytable;   在未作statistics 之前 它使用全表扫描 需要读取 多个数据块(一个数据块是 k) 做了statistics 之后 使用的是 INDEX (FAST FULL SCAN) 只需要读取 个数据块 但是 statistics 做得不好 也会导致Oracle 不使用索引   第 种情况就要复杂得多 一般概念上都认为索引比表快 比较难以理解什么情况下全表扫描要比索引扫描快 为了讲清楚这个问题 这里先介绍一下Oracle 在评估使用索引的代价(cost)时两个重要的数据 CF(Clustering factor) 和 FF(Filtering factor)   CF: 所谓 CF 通俗地讲 就是每读入一个索引块 要对应读入多少个数据块   FF: 所谓 FF 就是该sql 语句所选择的结果集 占总的数据量的百分比   大约的计算公式是 FF * (CF + 索引块个数) 由此估计出 一个查询 如果使用某个索引 会需要读入的数据块块数 需要读入的数据块越多 则 cost 越大 Oracle 也就越可能不选择使用 index (全表扫描需要读入的数据块数等于该表的实际数据块数)   其核心就是 CF 可能会比实际的数据块数量大 CF 受到索引中数据的排列方式影响 通常在索引刚建立时 索引中的记录与表中的记录有良好的对应关系 CF 都很小 在表经过大量的插入 修改后 这种对应关系越来越乱 CF 也越来越大 此时需要 DBA 重新建立或者组织该索引   如果某个sql 语句以前一直使用某索引 较长时间后不再使用 一种可能就是 CF 已经变得太大 需要重新整理该索引了   FF 则是Oracle 根据 statistics 所做的估计 比如 mytables 表有 万行 其主键myid的最小值是 最大值是 考虑以下sql 语句   Select * from mytables where myid>= ; 和   Select * from mytables where myid>=   这两句看似差不多的 sql 语句 对Oracle 而言 却有巨大的差别 因为前者的 FF 是 % 而后者的 FF 可能只有 % 如果它的CF 大于实际的数据块数 则Oracle 可能会选择完全不同的优化方式 而实际上 在我们的数据库上的测试验证了我们的预测 以下是在HP 上执行时它们的 explain plan:    第一句   SQL> select * from mytables where myid>= ;   已选择 行   Execution Plan       SELECT STATEMENT Optimizer=CHOOSE (Cost= Card= Byt es= )    TABLE ACCESS (FULL) OF MYTABLES (Cost= Card= Byt es= )   Statistics       recursive calls    db block gets    consistent gets    physical reads    redo size    bytes sent via SQL*Net to client    bytes received via SQL*Net from client    SQL*Net roundtrips to/from client    sorts (memory)    sorts (disk)    rows processed    第二句   Execution Plan       SELECT STATEMENT Optimizer=CHOOSE (Cost= Card= Bytes= )    TABLE ACCESS (BY INDEX ROWID) OF MYTABLES (Cost= Card=   Bytes= )    INDEX (RANGE SCAN) OF PK_MYTABLES (UNIQUE) (Cost= Card= )   Statistics       recursive calls    db block gets    consistent gets    physical reads    redo size    bytes sent via SQL*Net to client    bytes received via SQL*Net from client    SQL*Net roundtrips to/from client    sorts (memory)    sorts (disk)    rows processed    显而易见 第 句没有使用索引 第 句使用了主键索引pk_mytables FF的巨大影响由此可见一斑 由此想到 我们在写sql 语句时 如果预先估计一下 FF 你就几乎可以预见到 Oracle 会否使用索引    二讲 索引也有好坏   索引有 B tree 索引 Bitmap 索引 Reverse b tree 索引 等 最常用的是 B tree 索引 B 的全称是Balanced 其意义是 从 tree 的 root 到任何一个leaf 要经过同样多的 level 索引可以只有一个字段(Single column) 也可以有多个字段(Composite) 最多 个字段 I 还支持 Function based index 许多developer 都倾向于使用单列B 树索引   所谓索引的好坏是指    索引不是越多越好 特别是大量从来或者几乎不用的索引 对系统只有损害 OLTP系统每表超过 个索引即会降低性能 而且在一个sql 中 Oracle 从不能使用超过 个索引    很多时候 单列索引不如复合索引有效率    用于多表连结的字段 加上索引会很有作用   那么 在什么情况下单列索引不如复合索引有效率呢?有一种情况是显而易见的 那就是 当sql 语句所查询的列 全部都出现在复合索引中时 此时由于 Oracle 只需要查询索引块即可获得所有数据 当然比使用多个单列索引要快得多 (此时 这种优化方式被称为 Index only access path)   除此之外呢?我们还是来看一个例子吧   在 HP(Oracle ) 上执行以下语句   select count( ) from mytabs where coid>= and issuedate >= to_date ( yyyy mm dd )   一开始 我们有两个单列索引 I_mytabs (coid) I_mytabs (issuedate) 下面是执行情况   COUNT( )         Execution Plan       SELECT STATEMENT Optimizer=CHOOSE (Cost= Card= Bytes= )    SORT (AGGREGATE)    TABLE ACCESS (BY INDEX ROWID) OF T_MYTABS (Cost= Card   = Bytes= )    INDEX (RANGE SCAN) OF I_MYTABS (NON UNIQUE) (Cost=   Card= )   Statistics       recursive calls    db block gets    consistent gets    physical reads    redo size    bytes sent via SQL*Net to client    bytes received via SQL*Net from client    SQL*Net roundtrips to/from client    sorts (memory)    sorts (disk)    rows processed   可以看到 它读取了 个数据块来获得所查询的 多行   现在 去掉这两个单列索引 增加一个复合索引I_mytabs_test ( coid issuedate) 重新执行 结果如下   COUNT( )         Execution Plan       SELECT STATEMENT Optimizer=CHOOSE (Cost= Card= Bytes= )    SORT (AGGREGATE)    INDEX (RANGE SCAN) OF I_MYTABS_TEST (NON UNIQUE) (Cost= Card= Bytes= )   Statistics       recursive calls    db block gets    consistent gets    physical reads    redo size    bytes sent via SQL*Net to client    bytes received via SQL*Net from client    SQL*Net roundtrips to/from client    sorts (memory)    sorts (disk)    rows processed   可以看到 这次只读取了 个数据块    块对 块 这就是在这个例子中 单列索引与复合索引的代价之比 这个例子提示我们 在许多情况下 单列索引不如复合索引有效率   可以说 在索引的设置问题上 其实有许多工作可以做 正确地设置索引 需要对应用进行总体的分析    三讲 索引再好 不用也是白搭   抛开前面所说的 假设你设置了一个非常好的索引 任何傻瓜都知道应该使用它 但是Oracle 却偏偏不用 那么 需要做的第一件事情 cha138/Article/program/Oracle/201311/16841

相关参考

知识大全 oracle10g中unique与index的问题

  createtabletest  (  xinteger  yinteger  zinteger  );  altertabletestaddconstraintprimarykey(x);产生一

知识大全 oracle日期操作方法

  在oracle中有很多关于日期的函数如:  add_months()用于从一个日期值增加或减少一些月份  date_value:=add_months(date_valuenumber_of_mo

知识大全 but of 是什么意思

butof是什么意思?butof不是什么固定搭配是根据前半句出来的用法如:Lifeisn’tamatterofmilestones,butofmoments...but依然表示转折的意思,of前面省略

知识大全 "To make a child love book from the very beginning is of great help."中的"of"可以省略吗?

"Tomakeachildlovebookfromtheverybeginningisofgreathelp."中的"of"可以省略吗?  以下文字资料是由(全榜网网www.lis

知识大全 mysql index文件检查机制

  本文将重点讲述shell实战中的mysqlindex文件检查机制问题请先看代码:  #!/bin/sh  def_check_index()    #codebyscpman  #  #mail:

知识大全 in lack of的用法

inlackof的用法inlackof[释义]缺乏用法这里的lack是抽象名词,因此,inlackof这个短语成立,比如:Amaninlackofself-confidenceseizesnochan

知识大全 解析如何去掉CodeIgniter URL中的index.php

解析如何去掉CodeIgniterURL中的index.php  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来

《One Of Them Girls》歌词全文及译文

《OneOfThemGirls》由AshleyGorley/BenJohnson/DallasDavidson/LeeBrice作词作曲,LeeBrice演唱,LeeBrice生于1980年,南卡罗来

知识大全 责任链模式(Chain of Responsibility)

责任链模式(ChainofResponsibility)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 控制反转(Inversion of Control)介绍

控制反转(InversionofControl)介绍  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!