暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在Oracle中,哪几种情况不能用上索引?

DB宝 2017-12-04
506


Q
题目

Oracle中,哪几种情况不能用上索引?


     

A
答案


“为什么索引没有被使用”是一个涉及面较广的问题。有多种原因会导致索引不能被使用。首要的原因就是统计信息不准,第二原因就是索引的选择度不高,使用索引比使用全表扫描效率更差。还有一个比较常见的原因,就是对索引列进行了函数、算术运算或其他表达式等操作,或出现隐式类型转换,导致无法使用索引。还有很多其它原因会导致不能使用索引,这个问题在MOSMOSMy Oracle Support)“文档1549181.1为何在查询中索引未被使用”中有非常详细的解释,作者已经将相关内容发布到BLOGhttp://blog.itpub.net/26736162/viewspace-2113670/)上了。下面是一些非常有用的检查项目。

一、快速检查

表上是否存在索引?

索引是否应该被使用?

二、索引本身的问题

索引的索引列是否在WHERE条件中(Predicate List)?

索引列是否用在连接谓词中(Join Predicates)?

连接顺序(Join Order)是否允许使用索引?

索引列是否在IN或者多个OR语句中?

是否对索引列进行了函数、算术运算或其他表达式等操作?

索引列是否出现了隐式类型转换(Implicit Type Conversion)?

是否在语义(Semantically)上无法使用索引?

错误类型的索引扫描?

索引列是否可以为空?

NLS_SORT是否设置为二进制(BINARY)?

是否使用的是不可见索引(Invisible Indexes)?

三、优化器和成本计算相关问题

是否存在准确且合适的统计信息(Statistics)?

一个索引是否与其它的索引有相同的等级或者成本(Cost)?

索引的选择度是否不高?

在总体成本中,表扫描的成本是否占大部分?

访问空索引并不意味着比访问有值的索引高效?

参数设置是否正确?

四、其它问题

是否存在远程表(Remote Table)

是否使用了并行执行(PX)?

是否包含了子查询的UPDATE语句?

查询是否使用了绑定变量?

查询是否引用了带有延迟约束的列?

索引提示(Hint)是否不工作?

索引列是否使用了前置通配符(%)?

索引列是否使用了非等值连接符?

是否在WHERE子句中对索引列进行了IS NULL值判断?

是否查询转换失败导致不能选择索引?

是否使用了视图或子查询?


详细情况如下表所示:





DB笔试面试历史连接

http://mp.weixin.qq.com/s/Vm5PqNcDcITkOr9cQg6T7w

About Me:小麦苗

 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/

 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

 版权所有,欢迎分享本文,转载请保留出处

 QQ:646634621  QQ群:618766405

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。

文章转载自DB宝,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论