zoukankan      html  css  js  c++  java
  • ORACLE学习笔记性能优化3

    9.怎么避免使用特定索引
      在很多时候,Oracle会错误的使用索引而导致效率的明显下降,我们可以使用一点点技巧而避免使用不该使用的索引,如:
      表test,有字段a,b,c,d,在a,b,c上建立联合索引inx_a(a,b,c),在b上单独建立了一个索引Inx_b(b)。

      在正常情况下,where a=? and b=? and c=?会用到索引inx_a,where b=?会用到索引inx_b,但是,where a=? and b=? and c=? group by b会用到哪个索引呢?在分析数据不正确(很长时间没有分析)或根本没有分析数据的情况下,oracle往往会使用索引inx_b。通过执行计划的分析,这个索引的使用,将大大耗费查询时间。

      当然,我们可以通过如下的技巧避免使用inx_b,而使用inx_a。

      where a=? and b=? and c=? group by b||'' --如果b是字符
      where a=? and b=? and c=? group by b+0 --如果b是数字

      通过这样简单的改变,往往可以是查询时间提交很多倍
      当然,我们也可以使用no_index提示,相信很多人没有用过,也是一个不错的方法:
      select /*+ no_index(t,inx_b) */ * from test t
      where a=? and b=? and c=? group by b

      举例:
      本来在CM_USER上有索引IDX_CM_USER4(ACC_ID)和IDX_CM_USER8(BILL_ID),可是执行如下语句的时候很慢。
      select * from CM_USER where  acc_id =1200007175
      and user_status>0 and bill_id like '13%' order by acc_id,bill_id

      用explain分析,发现执行计划是用IDX_CM_USER8.如下查询
      select * from user_indexes where table_name ='CM_USER' 发现IDX_CM_USER8没有分析过。

      用下面语句执行计划改变
      select /*+INDEX(CM_USER IDX_CM_USER4)*/* from CM_USER where  acc_id =1200007175 and user_status>0 and bill_id like '13%' order by acc_id,bill_id

      或者分析索引
      exec dbms_stats.gather_index_stats(ownname => 'QACS1',indname => 'IDX_CM_USER8',estimate_percent => 5 );
      可以发现执行计划恢复正常。


    10.Oracle什么时候会使用跳跃式索引扫描
      这是9i的一个新特性跳跃式索引扫描(Index Skip Scan).
      例如表有索引index(a,b,c),当查询条件为where b=?的时候,可能会使用到索引index(a,b,c),如,执行计划中出现如下计划:
      INDEX (SKIP SCAN) OF 'TEST_IDX' (NON-UNIQUE)

      Oracle的优化器(这里指的是CBO)能对查询应用Index Skip Scans至少要有几个条件:
      <1> 优化器认为是合适的。
      <2> 索引中的前导列的唯一值的数量能满足一定的条件(如重复值很多)。
      <3> 优化器要知道前导列的值分布(通过分析/统计表得到)。
      <4> 合适的SQL语句
      等。


    11.怎么样创建使用虚拟索引
      可以使用nosegment选项,如
      create index virtual_index_name on table_name(col_name) nosegment;

      如果在哪个session需要测试虚拟索引,可以利用隐含参数来处理
      alter session set "_use_nosegment_indexes" = true;

      就可以利用explain plan for select ……来看虚拟索引的效果,利用@$ORACLE_HOME/rdbms/admin/utlxpls查看执行计划,最后,根据需要,我们可以删除虚拟索引,如普通索引一样
      drop index virtual_index_name;

      注意:虚拟索引并不是物理存在的,所以虚拟索引并不等同于物理索引,不要用自动跟踪去测试虚拟索引,因为那是实际执行的效果,是用不到虚拟索引的。

    12.怎样监控无用的索引
      Oracle 9i以上,可以监控索引的使用情况,如果一段时间内没有使用的索引,一般就是无用的索引
      语法为:
      开始监控:alter index index_name monitoring usage;
      检查使用状态:select * from v$object_usage;
      停止监控:alter index index_name nomonitoring usage;

      当然,如果想监控整个用户下的索引,可以采用如下的脚本:
      set heading off
      set echo off
      set feedback off
      set pages 10000
      spool start_index_monitor.sql
      SELECT 'alter index '||owner||'.'||index_name||' monitoring usage;'
      FROM dba_indexes
      WHERE owner = USER;
      spool off
      set heading on
      set echo on
      set feedback on
      ------------------------------------------------
      set heading off
      set echo off
      set feedback off
      set pages 10000
      spool stop_index_monitor.sql
      SELECT 'alter index '||owner||'.'||index_name||' nomonitoring usage;'
      FROM dba_indexes
      WHERE owner = USER;
      spool off
      set heading on
      set echo on
      set feedback on

  • 相关阅读:
    623. Add One Row to Tree 将一行添加到树中
    771. Jewels and Stones 珠宝和石头
    216. Combination Sum III 组合总数三
    384. Shuffle an Array 随机播放一个数组
    382. Linked List Random Node 链接列表随机节点
    向github项目push代码后,Jenkins实现其自动构建
    centos下安装Jenkins
    python提取批量文件内的指定内容
    批处理实现:批量为文件添加注释
    python抓取每期双色球中奖号码,用于分析
  • 原文地址:https://www.cnblogs.com/einyboy/p/2493520.html
Copyright © 2011-2022 走看看