限制索引导致索引无法被使用
来源:互联网 发布:买家淘宝退货率30% 编辑:程序博客网 时间:2024/06/12 01:27
如下情况会产生限制索引
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也不能让您明白为什么做了一次“全表扫描”。
0 0
- 限制索引导致索引无法被使用
- 因为前缀索引问题导致mysql无法使用覆盖索引
- PosgreSQL 索引 COLLATE 设置不当导致查询优化无法使用索引
- PosgreSQL 索引 COLLATE 设置不当导致查询优化无法使用索引
- 限制索引
- 导致Lucene无法索引查询的NoClassDefFoundError
- 关于mysql中由于类型转换导致索引无法使用的问题
- oracle避免限制索引
- mysql索引的限制
- 限制索引 Oracle
- 一些索引的限制
- mysql--索引的限制
- mongodb索引长度限制
- 收集统计信息导致索引被监控
- 无法使用索引的select语句
- 无法使用索引的select语句
- Oracle 索引无法使用的情况
- 左连接为什么无法使用索引
- Oracle table-lock的5种模式
- 权限知识中的AIX ACL
- win32(VS)下cocos2d-x创建的工程如在mac下打包
- cvHaarDetectObjects 解析(2)
- Unix shell判断和比较
- 限制索引导致索引无法被使用
- .....
- 用datagrid实现MSFlexGrid1的功能怎么实现
- android开发经典实例系列----TabHost、Gallery
- 定制Android关机界面
- Timus 1577. E-mail
- Android网络连接判断与处理(二)
- WindowsForms10窗口下的“按钮”怎么都找不到?
- Jenkins检查代码规范配置