zoukankan      html  css  js  c++  java
  • oracle索引优化

    零、概述

    在这之前,一直都是使用mysql来进行开发或者部署。最近及今后很长一段时间都要使用oracle,今天和同事也遇到一个oracle 慢查询问题。查了很多资料,这里记录备忘。持续更新ing。。。

    一、查看执行计划

    EXPLAIN PLAN FOR 
    待执行的sql;(不要忘了分号)
    SELECT     * FROM     TABLE (dbms_xplan.display());
    也可以使用下面这条,会显示更多信息:
    SELECT     * FROM     TABLE (dbms_xplan.display(null,null,'advanced'));

     可参考如下:

    查看Oracle执行计划的几种常用方法-系列1

    https://blog.csdn.net/bisal/article/details/38919181

    二、查看索引

    1、根据表名查询表上的索引

    select 
    b.uniqueness, a.index_name, a.table_name, a.column_name 
    from all_ind_columns a, all_indexes b
    where a.index_name=b.index_name 
    and a.table_name = upper('DISPATCHTASKINFO')
    order by a.table_name, a.index_name, a.column_position;

    其中,DISPATCHTASKINFO为表名。

    这个呢,一般工具都可以查看,只是有时候新加了索引,在查看执行计划的时候,总是因为各种各样的原因没有生效,这时候执行上述语句,看看我们的索引是否

    加成功了。

    2、根据索引名,查询索引相关信息

    select 
    b.uniqueness, a.index_name, a.table_name, a.column_name 
    from all_ind_columns a, all_indexes b
    where a.index_name=b.index_name 
    AND
    a.index_name = 'SYS_C0011421'
    order by a.table_name, a.index_name, a.column_position;

    注:标红为索引名字。

    三、执行计划的执行顺序

    一般,一个执行计划可能是下面这样的(在navicat for oracle中的执行效果):

     那么,要怎么去读懂这个内容呢?

    这边我也是参考了几个链接,写得比我好,我就不班门弄斧了。

    1、看懂Oracle执行计划

     https://www.cnblogs.com/Dreamer-1/p/6076440.html

    这个里面,讲解执行计划的顺序的那部分可以参考下面的这个链接,讲得更清楚一点。

     
    2、ORACLE执行计划的步骤和顺序
     https://blog.csdn.net/qshpeng/article/details/5820622

    3、其中的 name 那一列,在部分情况下,即为索引的名字。可以根据第二节中的方法进行查询。

    ps:这里需要注意的是,上面是navicat for oracle中的执行效果。

    可以看到,这里面缩进相当不明显,可以换别的客户端。

    比如Oracle Sql Developer中的效果好得多:

    四、优化器模式

    http://blog.itpub.net/17203031/viewspace-705012/

     

    五、强制使用索引

    select /*+ index(TABLE_NAME,INDEX_NAME) */ 
    
    from RECORD
    
    where entityId='24' and entityType='blog';

    在select后,添加类似于代码注释一样的东西,其中的红色标出来的部分,

    TABLE_NAME写要使用的索引的表名,INDEX_NAME为索引名。

    但是,这个只是hint,并不是真的强制使用,所以可能会被优化器忽略(优化器有自己的内在逻辑)。

    六、索引失效的可能原因

    oracle 索引失效原因及解决方法

    https://www.cnblogs.com/cxxjohnson/p/5836203.html

    我这边遇到的索引失效问题应该就是链接中提到的数据统计问题,后面执行了如下几条语句后即可以用上我新增的索引:

    analyze table INCIDENTINFORMATION compute statistics;
    
    ANALYZE TABLE INCIDENTINFORMATION COMPUTE STATISTICS FOR ALL INDEXED COLUMNS;
    
    analyze table INCIDENTINFORMATION compute statistics for table for all indexes for all indexed columns;
     基于我的理解,上面这几条语句,会去分析索引,索引无非是key--》value集合,其中,key是索引中包含的列(如果是组合索引,则是多个列),value就是数据所在的行的rowid的集合。
    最终呢,会得到这样的结果且被缓存起来:
    指定一个索引,能知道对应的rowid集合是啥,集合的size多大(主要是后边CBO优化器根据这个来判断cost大小,选择是否走该索引)。
     
     
     
  • 相关阅读:
    浅析深度优先和广度优先遍历实现过程、区别及使用场景
    浅析为什么要用setTimeout模拟setInterval
    app弹出软键盘获取键盘高度不准确的原因及导致底部定位的元素无法贴近键盘的问题
    App平台iOS设备上因内存不足导致白屏、闪退的原因及其解决方案
    浅谈移动端开发技术
    浅析Console命令调试常用方法
    js正则表达式中的正向肯定预查和正向否定预查, 反向肯定和反向否定(这个翻译不准确)
    javascript的版本查看及js的历史
    【转】JS-正则表达式的反向引用
    【转】Linux虚拟网络设备之tun/tap
  • 原文地址:https://www.cnblogs.com/grey-wolf/p/9494690.html
Copyright © 2011-2022 走看看