索引失效的几个原因

1 使用不等于操作符(<>、!=)
下面的查询即使在 cust_rating 列有一个索引,查询语句仍然执行一次全表扫描。
select cust_Id,cust_name from customers where   cust_rating <> ‘aa‘;        
把上面的语句改成如下的查询语句,这样,在采用基于规则的优化器而不是基于代价的
优化器(更智能)时,将会使用索引。
select cust_Id,cust_name from customers where cust_rating < ‘aa‘ or cust_rating > ‘aa‘; 
特别注意:通过把不等于操作符改成 OR 条件,就可以使用索引,以避免全表扫描。
2  使用 IS NULL  或 IS NOT NULL
使用 IS NULL  或 IS NOT NULL 同样会限制索引的使用。因为 NULL 值并没有被定义。
在 SQL 语句中使用 NULL 会有很多的麻烦。因此建议开发人员在建表时,把需要索引的列
设成  NOT NULL。如果被索引的列在某些行中存在 NULL 值,就不会使用这个索引(除非
索引是一个位图索引,关于位图索引在稍后在详细讨论)。
3  使用函数
如果不使用基于函数的索引,那么在 SQL 语句的 WHERE 子句中对存在索引的列使用
函数时,会使优化器忽略掉这些索引。  下面的查询不会使用索引(只要它不是基于函数的
索引)
select empno,ename,deptno from emp   where   trunc(hiredate)=‘01-MAY -81‘;
把上面的语句改成下面的语句,这样就可以通过索引进行查找。
select empno,ename,deptno from emp where   hiredate<(to_date(‘01-MAY -81‘)+0.9999);
4  比较不匹配的数据类型
也是比较难于发现的性能问题之一。  注意下面查询的例子,account_number 是一个
VARCHAR2 类型,在 account_number 字段上有索引。
下面的语句将执行全表扫描:
select bank_name,address,city,state,zip from banks where account_number = 990354;
Oracle 可以自动把 where 子句变成 to_number(account_number)=990354,这样就限
制了索引的使用,改成下面的查询就可以使用索引:
select bank_name,address,city,state,zip from banks where account_number =‘990354‘;
特别注意: 不匹配的数据类型之间比较会让 Oracle 自动限制索引的使用,即便对这个查
询执行 Explain Plan 也不能让您明白为什么做了一次―全表扫描‖。

时间: 2024-11-19 22:46:15

索引失效的几个原因的相关文章

oracle 索引失效原因

摘自网络http://blog.chinaunix.net/uid-23622436-id-3184356.html oracle 索引失效的原因 分类: Oracle 1) 没有查询条件,或者查询条件没有建立索引 2) 在查询条件上没有使用引导列 3) 查询的数量是大表的大部分,应该是30%以上. 4) 索引本身失效 5) 查询条件使用函数在索引列上(见12) 6) 对小表查询 7) 提示不使用索引 8) 统计数据不真实 9) CBO计算走索引花费过大的情况.其实也包含了上面的情况,这里指的是

索引失效原因总结

1. 随着表的增长,where条件出来的数据太多,大于15%,使得索引失效(会导致CBO计算走索引花费大于走全表) 2. 统计信息失效      需要重新搜集统计信息 3. 索引本身失效      需要重建索引 下面是一些不会使用到索引的原因 索引失效 1) 没有查询条件,或者查询条件没有建立索引 2) 在查询条件上没有使用引导列 3) 查询的数量是大表的大部分,应该是30%以上. 4) 索引本身失效 5) 查询条件使用函数在索引列上(见12) 6) 对小表查询 7) 提示不使用索引 8) 统计

数据库索引失效原因

1.应尽量避免在where子句中使用!=或者<>操作符,否则引擎将放弃使用索引而进行全表扫描. 2.尽量避免在where子句中使用or来链接条件,否则将导致引擎放弃使用索引而进行全表扫描,即使其中有条件带索引也不会使用,这也是为什么尽量少使用or的原因. 3.对于多列索引,应满足最左匹配原则: 4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不会使用索引. 5.link的模式查询以%开头,索引失效. 6.应尽量避免在wher子句中对字段进行表达式操作,这将导致引擎放弃使用索

oracle 索引失效原因_汇总

1) 没有查询条件,或者查询条件没有建立索引 2) 在查询条件上没有使用引导列 3) 查询的数量是大表的大部分,应该是30%以上. 4) 索引本身失效 5) 查询条件使用函数在索引列上,或者对索引列进行运算,运算包括(+,-,*,/,! 等) 错误的例子:select * from test where id-1=9; 正确的例子:select * from test where id=10; 6) 对小表查询 7) 提示不使用索引 8) 统计数据不真实 9) CBO计算走索引花费过大的情况.其

MySQL索引失效原因

索引失效的案例: 1.全值匹配我最爱 建立几个复合索引字段,最好就用上几个字段.且按照顺序使用 2.最佳左前缀法则 如果索引了多列,要遵守最左前缀法则,指的是查询从索引的最左前列开始,不跳过索引中间的列.(带头大哥不能死,中间兄弟不能丢) 3.不再索引列上做任何操作(计算.函数.(自动or手动)类型转换),会导致索引失效而转向权标扫描 4.存储引擎不能使用索引中范围条件右边的列.(范围之后全失效) 若中间索引列用到了范围(>.<.like等),则后面的索引全失效 5.尽量使用覆盖索引(只访问索

Oracle数据库索引使用及索引失效总结

容易引起oracle索引失效的原因很多: 1.在索引列上使用函数.如SUBSTR,DECODE,INSTR等,对索引列进行运算.需要建立函数索引就可以解决了. 2.新建的表还没来得及生成统计信息,分析一下就好了 3.基于cost的成本分析,访问的表过小,使用全表扫描的消耗小于使用索引. 4.使用<>.not in .not exist,对于这三种情况大多数情况下认为结果集很大,一般大于5%-15%就不走索引而走FTS. 5.单独的>.<. 6.like "%_"

MySQL表字段字符集不同导致的索引失效问题

1. 概述 昨天在一位同学的MySQL机器上面发现了这样一个问题,MySQL两张表做left join时,执行计划里面显示有一张表使用了全表扫描,扫描全表近100万行记录,大并发的这样的SQL过来数据库变得几乎不可用了,今天和大家一起分享下这个问题的原因及解决办法,希望可以帮助大家更好的学习MySQL数据库,一起来看看吧.MySQL版本为官方5.7.12. 2. 问题重现 首先,表结构和表记录如下: mysql> show create table t1\G ******************

SQL查询:『索引失效问题』

1.IN操作符 用IN操作符写出来的SQL直观简单.易于理解.但是在where条件中使用IN操作符是低效的.例如下面这条查询语句: SELECT * FROM tab_a WHERE id IN( SELECT a_id FROM tab_b); 你认为它会怎么执行呢?先从tab_a表中遍历数据,然后拿每行数据的id字段去tab_b表中去查找,只要找到就把这行纳入查询结果. 大错特错!事实上,RDBMS会先执行第4行的子查询,把查出的数据保存到一张临时表中,再执行主查询,利用临时表中的数据去核对

【转-mysql索引失效的几种情形】

索引并不是时时都会生效的,比如以下几种情况,将导致索引失效: 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引 2.对于多列索引,不是使用的第一部分(第一个),则不会使用索引 3.like查询是以%开头 4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引 5.如果MySQL估计使用全表扫描要比使用索引快,则不使用索引 此外,查看索引的使用情况show stat