ORACLE 查询不走索引的原因分析,解决办法通过强制索引或动态执行SQL语句提高查询速度
(一)索引失效的原因分析:
- <>或者单独的>,<,(有时会用到,有时不会)
- 有时间范围查询;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语句提高查询速度的更多相关文章
- 解决乱码的方法是,在执行SQL语句之前,将MySQL以下三个系统参数设置为与服务器字符集character-set-server相同的字符集
character-set-server/default-character-set:服务器字符集,默认情况下所采用的. character-set-database:数据库字符集. characte ...
- Hibernate执行SQL语句实现查询修改功能!
今天玩Hibernate时突然就想写写SQL语句查询... DAO : //查询 public List<?> createSqlQueryList(final String queryS ...
- PHP获取MySQL执行sql语句的查询时间
//计时开始 runtime(); //执行查询 mysql_query($sql); //计时结束. echo runtime(1); //计时函数 function runtime($mode=0 ...
- [转]ORACLE 动态执行SQL语句
本文转自:http://zhaisx.iteye.com/blog/856472 Oracle 动态SQLOracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immediat ...
- ORACLE 动态执行SQL语句
本文转自 http://zhaisx.iteye.com/blog/856472 Oracle 动态SQL Oracle 动态SQL有两种写法:用 DBMS_SQL 或 execute immedia ...
- (转载)PHP怎么获取MySQL执行sql语句的查询时间
(转载自CSDN) 方法一: //计时开始 runtime(); //执行查询 mysql_query($sql); //计时结束. echo runtime(1); //计时函数 function ...
- Oracle常见死锁发生的原因以及解决方法
Oracle常见死锁发生的原因以及解决办法 一,删除和更新之间引起的死锁 造成死锁的原因就是多个线程或进程对同一个资源的争抢或相互依赖.这里列举一个对同一个资源的争抢造成死锁的实例. Oracle 1 ...
- 解决Mysql搭建成功后执行sql语句报错以及区分大小写问题
刚搭建完mysql 8.0以后会: 一.表区分大小写, 二.执行正确的sql语句成功且会报:[Err] 1055 - Expression #1 of ORDER BY clause is not i ...
- oracle 索引失效原因及解决方法
oracle 索引失效原因及解决方法 2010年11月26日 星期五 17:10 一.以下的方法会引起索引失效 1,<>2,单独的>,<,(有时会用到,有时不会)3,like ...
随机推荐
- [bzoj2783][JLOI2012]树_树的遍历
树 bzoj2783 JLOI2012 题目大意:给定一棵n个点的树.求满足条件的路径条数.说一个路径是满足条件的,当且仅当这条路径上每个节点深度依次递增且点权和为S. 注释:$1\le n\le 1 ...
- Linux环境变量设置中配置文件分析(/etc/profile,~/.bashrc等)(转)
说明:在研究中发现,对于不同版本的Linux系统有着不同的文件,但是总的入口是不变的/etc/profile,下面只是展示加载顺序的研究过程,所以会有些系统没有这个文件等问题. 一.配置文件与作用域: ...
- 机器学习10k均值
下面介绍无监督机器学习算法,与前面分类回归不一样的是,这个不知道目标变量是什么,这个问题解决的是我们从这些样本中,我们能发现什么. 这下面主要讲述了聚类算法,跟数据挖掘中的关联挖掘中的两个主要算法. ...
- 解释为什么word2vec也被称作deep learning
作者:orangeprince链接:https://www.zhihu.com/question/27689129/answer/39117725来源:知乎著作权归作者所有.商业转载请联系作者获得授权 ...
- Axure RP一个专业的高速原型设计工具
Axure RP是一个专业的高速原型设计工具.Axure(发音:Ack-sure),代表美国Axure公司.RP则是Rapid Prototyping(高速原型)的缩写. Axure简要介绍 Axur ...
- @PropertySource&@ImportResource&@Bean
@**PropertySource**:加载指定的配置文件: ```java /** * 将配置文件中配置的每一个属性的值,映射到这个组件中 * @ConfigurationProperties:告诉 ...
- luogu1052 过河
题目大意 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...
- wesome-android
awesome-android Introduction android libs from github System requirements Android Notice If the lib ...
- P3959 宝藏 模拟退火。。。
竟然模拟退火能做!我就直接抄代码了,我加了点注释. 题干: 题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 nn 个深埋在地下的宝藏屋, 也给出了这 nn 个宝藏屋之间可供开发的 mm ...
- PCB MS CLR 聚合函数 joinString加排序实现
准备着手,动态列SQL查询,要实现动态列SQL,会运用到聚合函数,而SQL本身聚合函数有限, 无满足此用户任意字段组合变化,再加上工艺流程重复相同工序,如;沉铜1,沉铜2对应工序代码都是相同的 而通常 ...