知识大全 索引什么时候不工作

Posted 索引

篇首语:世间事飘忽不定者多,万事随心,随不了心便随缘,随不了缘便随时势。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 索引什么时候不工作相关的知识,希望对你有一定的参考价值。

  首先要声明两个知识点

  ( )RBO&CBO

  Oracle有两种执行优化器 一种是RBO(Rule Based Optimizer)基于规则的优化器 这种优化器是基于sql语句写法选择执行路径的 另一种是CBO(Cost Based Optimizer)基于规则的优化器 这种优化器是Oracle根据统计分析信息来选择执行路径 如果表和索引没有进行分析 Oracle将会使用RBO代替CBO 如果表和索引很久未分析 CBO也有可能选择错误执行路径 不过CBO是Oracle发展的方向 自 i版本来已经逐渐取代RBO

  ( )AUTOTRACE

  要看索引是否被使用我们要借助Oracle的一个叫做AUTOTRACE功能 它显示了sql语句的执行路径 我们能看到Oracle内部是怎么执行sql的 这是一个非常好的辅助工具 在sql调优里广泛被运用 我们来看一下怎么运用AUTOTRACE

  ① 由于AUTOTRACE自动为用户指定了Execution Plan 因此该用户使用AUTOTRACE前必须已经建立了PLAN_TABLE 如果没有的话 请运行utlxplan sql脚本(它在$ORACLE_HOME/rdbms/admin目录中)

  ② AUTOTRACE可以通过运行plustrce sql脚本(它在$ORACLE_HOME/sqlplus/admin目录中)来设置 用sys用户登陆然后运行plustrce sql后会建立一个PLUSTRACE角色 然后给相关用户授予PLUSTRACE角色 然后这些用户就可以使用AUTOTRACE功能了

  ③ AUTOTRACE的默认使用方法是set autotrace on 但是这方法不总是适合各种场合 特别当返回行数很多的时候 Set autotrace traceonly提供了只查看统计信息而不查询数据的功能

  SQL> set autotrace onSQL> select * from test;         A          Execution Plan          SELECT STATEMENT Optimizer=CHOOSE          TABLE ACCESS (FULL) OF TEST 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

  SQL> set autotrace traceonlySQL> select * from test test;

  Execution Plan          SELECT STATEMENT Optimizer=CHOOSE          TABLE ACCESS (FULL) OF TEST

  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

  Hints是Oracle提供的一个辅助用法 按字面理解就是 提示 的意思 确实它起得作用也是提示优化器按它所提供的关键字来选择执行路径 特别适用于sql调整的时候 使用方法如下

  DELETE|INSERT|SELECT|UPDATE /*+ hint [text] [hint[text]] */

  具体可参考Oracle SQL Reference

  有了前面这些知识点 接下来让我们来看一下什么时候索引是不起作用的 以下列出几种情况

  ( )类型不匹配时

  SQL> create table test testindex (a varchar( ) b number);表已创建 SQL> create index ind_cola on test testindex(a);索引已创建 SQL> insert into test testindex values( );已创建 行 SQL> mit;提交完成 SQL> analyze table test testindex pute statistics for all indexes;表已分析 SQL> set autotrace on;

  SQL> select /*+RULE */* FROM test testindex where a= ;(使用基于rule的优化器 数据类型匹配的情况下)A           B            Execution Plan          SELECT STATEMENT Optimizer=HINT: RULE          TABLE ACCESS (BY INDEX ROWID) OF TESTINDEX             INDEX (RANGE SCAN) OF IND_COLA (NON UNIQUE)(使用了索引ind_cola)――――――――――――――――――――――――――――――――――SQL> select /*+RULE */* FROM test testindex where a= ;(数据类型不匹配的情况)A           B            Execution Plan          SELECT STATEMENT Optimizer=HINT: RULE          TABLE ACCESS (FULL) OF TESTINDEX (优化器选择了全表扫描)

  ( )条件列包含函数但没有创建函数索引

  SQL> select /*+ RULE */*  FROM test testindex where upper(a)= A ;(使用了函数upper()在列a上);A           B a           Execution Plan          SELECT STATEMENT Optimizer=HINT: RULE          TABLE ACCESS (FULL) OF TESTINDEX (优化器选择全表扫描) 创建基于函数的索引SQL> create index test ind_fun on test testindex(upper(a));索引已创建 SQL> insert into testindex values( a );已创建 行 SQL> mit;提交完成 SQL> select /*+ RULE*/*  FROM test testindex where upper(a)= A ;A           B a           Execution Plan          SELECT STATEMENT Optimizer=HINT: RULE          TABLE ACCESS (FULL) OF TESTINDEX (在RULE优化器下忽略了函数索引选择了全表扫描) SQL> select *  FROM test testindex where upper(a)= A ;A           B a           Execution Plan          SELECT STATEMENT Optimizer=CHOOSE (Cost= Card= Bytes= )          TABLE ACCESS (BY INDEX ROWID) OF TESTINDEX (Cost= Card=          Bytes= )            INDEX (RANGE SCAN) OF IND_FUN (NON UNIQUE) (Cost= Car          d= )(CBO优化器使用了ind_fun索引)

  ( )复合索引中的前导列没有被作为查询条件

  创建一个复合索引SQL> create index ind_ on test testindex(a b);索引已创建 SQL> select /*+ RULE*/* from test testindex where a= ;A           B            Execution Plan          SELECT STATEMENT Optimizer=HINT: RULE          INDEX (RANGE SCAN) OF IND_ (NON UNIQUE)(条件列表包含前导列时使用索引ind_)SQL> select /*+ RULE*/* from test testindex where b= ;未选定行Execution Plan          SELECT STATEMENT Optimizer=HINT: RULE          TABLE ACCESS (FULL) OF TESTINDEX (条件列表不包括前导列是选择全表扫描)

  ( )CBO模式下选择的行数比例过大 优化器采取了全表扫描 SQL> select * from test testindex where a= ;A           B            Execution Plan          SELECT STATEMENT Optimizer=CHOOSE (Cost= Card= Bytes= )          TABLE ACCESS (FULL) OF TESTINDEX (Cost= Card= Bytes= )(表一共 行 选择比例为 % 所以优化器选择了全表扫描)――――――――――――――――――――――――――――――――――下面增加表行数SQL> declare i number;    begin    for i in loop    insert into test testindex values (to_char(i) i);    end loop;    end;    /PL/SQL 过程已成功完成 SQL> mit;提交完成 SQL> select count(*) from test testindex;  COUNT(*) SQL> select * from test testindex where a= ;A             B                           Execution PlanSELECT STATEMENT Optimizer=CHOOSE (Cost= Card= Bytes= )        INDEX (RANGE SCAN) OF IND_ (NON UNIQUE) (Cost= Card= Bytes= )(表一共 行 选择比例为 / = % 所以优化器选择了索引扫描)

  ( )CBO模式下表很久没分析 表的增长明显 优化器采取了全表扫描

  SQL> select * from test testindex where a like % ;A             B                                                                                                                                                  已选择 行 Execution Plan          SELECT STATEMENT Optimizer=CHOOSE (Cost= Card= Bytes= )        TABLE ACCESS (FULL) OF TESTINDEX (Cost= Card= Bytes= )(表一共 行 选择比例为 / > % 优化器选择了全表扫描)――――――――――――――――――――――――――――――――――增加表行数SQL> declare i number;    begin    for i in loop    insert into test testindex values (to_char(i) i);    end loop;    end;    /PL/SQL 过程已成功完成 SQL> mit;提交完成 SQL> select count(*) from test testindex;  COUNT(*) SQL> select * from test testindex where a like % ;A             B                                                                                                                                                              已选择 行 Execution Plan          SELECT STATEMENT Optimizer=CHOOSE (Cost= Card= Bytes= )       TABLE ACCESS (FULL) OF TESTINDEX (Cost= Card= Bytes= )  (表一共 行 选择比例为 / < % 优化器选择了全表扫描 选择路径是错误的)―――――――――――――――――――――――――――――给表做分析

cha138/Article/program/Oracle/201311/17270

相关参考

知识大全 当我正在为表建立索引的时候,SQL Server 会禁止对表的访问吗

当我正在为表建立索引的时候,SQLServer会禁止对表的访问吗?  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一

知识大全 监视未使用索引

  作者gototop    索引可以加快查询的速度但索引会占用许多存储空间在插入和删除行的时候索引还会引入额外的开销因此确保索引得到有效利用是我们很关注的一个问题在Oraclei之前要知道一个索引是

知识大全 找到无用的索引

  DML性能低下其中最严重的原因之一是无用索引的存在所有SQL的插入更新和删除操作在它们需要在每一行数据被改变时修改大量索引的时候会变得更慢    许多Oracle管理人员只要看见在一个SQL查询的

知识大全 重建索引(rebuild index)与sort

  重建索引到底要不要排序?有人说要因为创建索引时需要排序有人说不要因为重建索引的时候可以直接扫描旧的索引来重建成新的索引让我们来看一下rebuildindex到底需不需要排序    SQL>s

知识大全 创建索引选择合适的可选项

  有些新手在Oracle数据库中创建索引时往往不会使用可选项其实有时候在合适的场合使用一些可选项可以提高索引的创建速度如为了大批量导入数据我们往往会先取消索引其以提高插入的速度然后等数据导入完毕后再

知识大全 11G的不可见索引

11G的不可见索引  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  不可见索引是G的新特性不可见并

知识大全 高级扫描提高数据库查询性能

  一高级扫描使用举例  通常情况下在数据查询的时候数据库会利用索引或者通过全表扫描来查找数据但是如果需要的数据在数据库中存储不连续或者需要查找的记录比较多时此时索引的效果就会大打折扣在这种情况下数据

知识大全 各种索引的结构分析降序索引和位图索引

  降序索引  降序索引是i里面新出现的一种索引是B*Tree的另一个衍生物它的变化就是列在索引中的储存方式从升序变成了降序在某些场合下降序索引将会起作用举个例子我们来查询一张表并进行排序  SQL&

知识大全 文件 - 索引文件(一)

  索引文件构成  索引文件  索引文件由主文件和索引表构成  ①主文件文件本身  ②索引表在文件本身外建立的一张表它指明逻辑记录和物理记录之间的一一对应关系  索引表组成  索引表由若干索引项组成一

知识大全 工作的时候我不开心,不工作了我也不开心,终日乏力疲倦,我的幸福感怎么这么低下

工作的时候我不开心,不工作了我也不开心,终日乏力疲倦,我的幸福感怎么这么低下?找个感兴趣的工作工作我自己也不开心,不工作我家人也会不开心,我是不是忧郁症了那么你就找一份自己喜欢的工作你自己也舒心家人也