SQL语句不走索引总结

作者简介:杨春龙,现就职于北京海天起点,持有Oracle 10g OCP 、Oracle 11g OCP、Oracle 11g OCM证书。7年移动、联通、电信三大运营商现场运维经验。擅长Oralce数据库性能优化、故障处理。

现象描述:

应用侧反应数据库运行缓慢,应用连接报超过最大数据库限制

  • 数据库等待事件: SQL_HASH_VALE=3335737581 并发30,等待时间较长

  • SQL_FULLTEXT
  • SQL执行计划如下:

分析:能过过滤条件2、3可知,SQL (TRIM(“A”.”OWNERID”)=:1) (“E”.”ACTIVITYID”=:2) 两列进行过滤筛选,但此时的SQL执行计划是走了TAF全表扫描。

  • 查看表上的索引列信息

    分析:在两表上PUB_ATTACHMENT_INFO:ownerid有索引,但在BS_ATTACH_EXT:ACTIVITYID表中无索引,分析SQL发现在SQL的索引列上使用了trim函数:TRIM(a.OwnerId)=:1 AND e.activityId= :2,在普通索引列上使用函数时,不会使用索引,因此在使用trim后,ownerid上的索引并未被用到。

优化建议:

在表列PUB_ATTACHMENT_INFO:ownerid上创建函数索引

在表列BS_ATTACH_EXT:ACTIVITYID 创建普通索引

优化后跟踪:

应用反馈SQL语句由优化前的>30s下降到了<100ms。

Oracle 数据库当中不走索引的情况总结如下:

  • 使用<>、!= 不等于运算符时
  • 单独的>,<, 结果集<5%使用使用到索引
  • ike “%_” 百分号在前. 模糊取值不会使用索引
  • 表没分析. 在CBO的规则下。表统计信息过旧是造成不走索引的主要原因,
  • 单独引用复合索引里非第一位置的索引列.
  • 存在隐式转换,所以此时不会用到索引
  • 对索引列进行运算.需要建立函数索引. 与文SQL语句成因相同。
  • not in ,not exist.
  • 当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况。
  • 索引失效。
  • 基于cost成本分析(Oracle因为走全表成本会更小):查询小表,或者返回值大概在5%以上

未经允许不得转载:Oracle一体机用户组 » SQL语句不走索引总结

相关推荐