前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【DB笔试面试565】在Oracle中,为什么索引没有被使用?

【DB笔试面试565】在Oracle中,为什么索引没有被使用?

作者头像
小麦苗DBA宝典
发布2019-09-29 15:42:41
1.1K0
发布2019-09-29 15:42:41
举报

题目部分

在Oracle中,为什么索引没有被使用?

答案部分

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

一、快速检查

n 表上是否存在索引?

n 索引是否应该被使用?

二、索引本身的问题

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

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

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

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

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

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

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

n 错误类型的索引扫描?

n 索引列是否可以为空?

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

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

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

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

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

n 索引的选择度是否不高?

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

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

n 参数设置是否正确?

四、其它问题

n 是否存在远程表(Remote Table)?

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

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

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

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

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

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

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

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

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

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

详细情况如下表所示:

建议读者对每种类型的情况都做实验,以便加深理解和印象。

& 说明:

有关每个检查点的详细内容可以参考我的BLOG:http://blog.itpub.net/26736162/viewspace-2113670/

本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DB宝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档