(一)索引失效的原因分析:

  • <>或者单独的>,<,(有时会用到,有时不会)
  • 有时间范围查询;oracle 时间条件值范围越大就不走索引
  • like "%_" 百分号在前.
  • 表没分析(统计信息最好定期收集,以业务的不同确定不同的收集周期,在新增的索引有可能没有收集 ,那么就会导致索引失效)

  解决方法:

    分析方法有一下几种:
    analyze table t1 compute statistics fortable; --针对表收集信息

    analyze table t2 compute statistics for allcolumns; --针对表字段收集信息

    analyze table t3 compute statistics for all indexescolumns; --收集索引字段信息

    analyze table t4 computestatistics;       --收集表,表字段,索引信息

    analyze table t5 compute statistics for allindexes;         --收集索引信息

    analyze table t6 compute statistics for table for all indexesfor allcolumns;   --

    --收集表,索引,表字段信息

  • 单独引用复合索引里非第一位置的索引列.
  • 字符型字段为数字时在where条件里不添加引号.
  • 对索引列进行运算.需要建立函数索引.
  • not in ,not exist.
  • 当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况。
  • 索引失效。
  • 基于cost成本分析(Oracle因为走全表成本会更小):查询小表,或者返回值大概在10%以上;

  解决办法:

    在这种条件下 oracle会认为索引更占资源,就默认不走索引了。这种情况如果觉得索引快的,通过强制索引提高查询速度 

     select   /*+INDEX(t IDEX_HZYB_JSJL_BDJSRQ)*/   from hzyb_jsjl t
     where BDJSRQ >TO_DATE('','');
    其中T是 表名   IDEX_HZYB_JSJL_BDJSRQ 是表的索引

  • 有时都考虑到了 但就是不走索引,drop了从建试试在
  • B-tree索引 is null不会走,is not null会走,(B树索引示例:create index random_empno_idx on test_random(empno);)
  • 位图索引 is null,is not null   都会走(位图索引示例:create bitmap index normal_empno_bmx on test_normal(empno);)
  • 联合索引 is not null 只要在建立的索引列(不分先后)都会走,(组合索引示例:SQL> create index indx_t on t(object_type,object_name);)

in null时   必须要和建立索引第一列一起使用,当建立索引第一位置条件是is null 时,其他建立索引的列可以是is null(但必须在所有列都满足is null的时候),或者=一个值;
当建立索引的第一位置是=一个值时,其他索引列可以是任何情况(包括is null =一个值),以上两种情况索引都会走。其他情况不会走。

(二)通过动态执行SQL提高查询COUNT()执行速度

 var_strquery1 := 'SELECT COUNT(1)';
var_strquery := 'FROM r_sn_link k
LEFT JOIN mfworkstatus s
ON k.p_sn = s.sysserialno
LEFT JOIN mfworkorder r
ON k.wo = r.workorderno
WHERE 1 = 1 '; IF var_smt_wo IS NOT NULL OR var_smt_wo <> ''
THEN
var_strquery := var_strquery || ' AND k.wo =''' || var_smt_wo || '''';
END IF; IF var_dip_wo IS NOT NULL OR var_dip_wo <> ''
THEN
var_strquery :=
var_strquery || ' AND s.workorderno =''' || var_dip_wo || '''';
END IF; IF var_skuno IS NOT NULL OR var_skuno <> ''
THEN
var_strquery :=
var_strquery
|| ' AND (r.skuno ='''
|| var_skuno
|| ''''
|| 'OR s.skuno ='''
|| var_skuno
|| ''''
|| ')';
END IF; IF var_sn_code IS NOT NULL OR var_sn_code <> ''
THEN
var_strquery :=
var_strquery || ' AND k.sn_code = ''' || var_sn_code || '''';
END IF; IF var_p_sn IS NOT NULL OR var_p_sn <> ''
THEN
var_strquery := var_strquery || 'AND k.p_sn =''' || var_p_sn || '''';
END IF; IF var_from_datetime IS NOT NULL OR var_from_datetime <> ''
THEN
var_strquery :=
var_strquery
|| ' AND k.work_time >= to_date('
|| var_from_datetime
|| ',''yyyy/mm/dd hh24:mi:ss'')';
END IF; IF var_to_datetime IS NOT NULL OR var_to_datetime <> ''
THEN
var_strquery :=
var_strquery
|| ' AND k.work_time <= to_date('
|| var_to_datetime
|| ',''yyyy/mm/dd hh24:mi:ss'')';
END IF; --动态执行查询语句返回记录数
EXECUTE IMMEDIATE var_strquery1 || var_strquery INTO var_rowcount;

ORACLE 查询不走索引的原因分析,解决办法通过强制索引或动态执行SQL语句提高查询速度的更多相关文章

  1. 解决乱码的方法是,在执行SQL语句之前,将MySQL以下三个系统参数设置为与服务器字符集character-set-server相同的字符集

    character-set-server/default-character-set:服务器字符集,默认情况下所采用的. character-set-database:数据库字符集. characte ...

  2. Hibernate执行SQL语句实现查询修改功能!

    今天玩Hibernate时突然就想写写SQL语句查询... DAO : //查询 public List<?> createSqlQueryList(final String queryS ...

  3. PHP获取MySQL执行sql语句的查询时间

    //计时开始 runtime(); //执行查询 mysql_query($sql); //计时结束. echo runtime(1); //计时函数 function runtime($mode=0 ...

  4. [转]ORACLE 动态执行SQL语句

    本文转自:http://zhaisx.iteye.com/blog/856472 Oracle 动态SQLOracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immediat ...

  5. ORACLE 动态执行SQL语句

    本文转自 http://zhaisx.iteye.com/blog/856472 Oracle 动态SQL Oracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immedia ...

  6. (转载)PHP怎么获取MySQL执行sql语句的查询时间

    (转载自CSDN) 方法一: //计时开始 runtime(); //执行查询 mysql_query($sql); //计时结束. echo runtime(1); //计时函数 function ...

  7. Oracle常见死锁发生的原因以及解决方法

    Oracle常见死锁发生的原因以及解决办法 一,删除和更新之间引起的死锁 造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖.这里列举一个对同一个资源的争抢造成死锁的实例. Oracle 1 ...

  8. 解决Mysql搭建成功后执行sql语句报错以及区分大小写问题

    刚搭建完mysql 8.0以后会: 一.表区分大小写, 二.执行正确的sql语句成功且会报:[Err] 1055 - Expression #1 of ORDER BY clause is not i ...

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

    oracle 索引失效原因及解决方法 2010年11月26日 星期五 17:10 一.以下的方法会引起索引失效 ‍1,<>2,单独的>,<,(有时会用到,有时不会)3,like ...

随机推荐

  1. PatentTips - Indexes of graphics processing objects in GPU commands

    BACKGROUND A graphics processing unit (GPU) is a specialized electronic device that is specifically ...

  2. N - Corporate Identity

    Beside other services, ACM helps companies to clearly state their “corporate identity”, which includ ...

  3. 关于重置IOS App请求推送的授权请求

    项目要加入推送通知.測试完本地通知后.发现測不了远程通知.于是想重置授权请求. 下面是重置授权请求的方法: 方法一: 通用->还原->抹掉全部内容和设置 可是第一种方法非常费时,抹掉内容预 ...

  4. 2018你应该了解这些.NET面试题

    2018年准备要找.NET开发相关工作的你准备好了吗,下面是小编准备的一些.NET相关的面试题,来阅读一下,也许对你有帮助哦~ 1. 谈谈你对MVC和三层架构的理解. MVC即模型.视图.控制器,模型 ...

  5. 大学,助你成长or 让你堕落?

    不管是论坛.贴吧.还是博客,都或多或少能够看到诸如对大学教育的反思.抨击之类的文章.至于什么是大学,大学又该怎样度过.大学是助你成长还是让你堕落了?我想这应该是一个见仁见智的问题.作为一个过来人,结合 ...

  6. java电影站点开发经验3

    上次讲到了.站点有资源了.可是必需要点缀下站点,要不光有资源比較空的.最開始就是想到了给资源加入评论功能的.然后自己就向开发个评论功能. 可是由于时间问题,并且本人也比較懒,就想在网上找找解决方式.嘻 ...

  7. JQuery调用WCF服务,部署在iis

    Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable ...

  8. CockroachDB——类似spanner的开源版,底层使用rocksdb存储,mvcc,支持事务,raft一致性,licence是CockroachDB Community License Agreement

    摘自:https://github.com/cockroachdb/cockroach/blob/master/docs/design.md CockroachDB is a distributed ...

  9. bzoj2935 [Poi1999]原始生物——欧拉回路

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2935 考察欧拉回路性质的题目呢: TJ:https://blog.csdn.net/u014 ...

  10. Swift备忘录

    Swift 备忘录 2015-4 一.简介 1.Swift 语言由苹果公司在2010年7月开始设计,在 2014 年6月推出,在 2015 年 12 月 3 日开源 2.特点(官方): (1)苹果宣称 ...