Oracle在什么情况下可不使用索引

发布时间 2024-01-06 14:05:19作者: anjun_xf

数据库AWR报告监控到耗时160s。此表有200w数据,rr_time创建了索引。分析发现还是执行了全表扫描。

SELECT max(rr_time) FROM cpoint where uid='12' and rr_time<=to_date('2024-1-5 23:59:59','yyyy-mm-dd hh24:mi:ss')

改为成between-and就用上了索引

SELECT max(rr_time) FROM cpoint where uid='12' and rr_time between to_date('2023-12-5 23:59:59','yyyy-mm-dd hh24:mi:ss') and to_date('2024-1-5 23:59:59','yyyy-mm-dd hh24:mi:ss')

Oracle在以下情况下可能会不使用索引:

  1. WHERE条件中与NULL比较:如果WHERE条件中的列与NULL值进行比较,Oracle可能会选择全表扫描而不是使用索引。
  2. 聚集操作:如COUNTSUMAVGMAXMIN等,执行这些操作时,Oracle可能不会使用索引。
  3. 显示或隐式的函数转换:如果在查询中涉及显示或隐式的函数转换,那么该列的索引可能不会被使用。
  4. CBO模式下统计信息过时:如果Oracle的成本基优化器(CBO)使用过时的统计信息,它可能会决定不使用索引。
  5. 组合索引中未使用前导列:如果查询没有使用组合索引的前导列,那么该组合索引可能不会被使用。
  6. 访问的数据量超过一定比例:如果查询访问的数据量超过了表中的一定比例,那么Oracle可能会决定不使用索引。
  7. 索引失效或丢失:如果数据库中的索引被减少、删除或者失效,查询语句就无法使用索引。这一问题通常出现在数据表结构发生变化、数据导入或者转储时。
  8. 数据分布不均匀:当数据表中的数据分布不均匀时,索引对查询语句的优化作用就会受到影响。
  9. 大量重复数据:当数据表中存在大量重复的数据时,索引就会失去作用。
  10. 存在复杂的查询语句:当SQL语句过于复杂时,执行计划会变得复杂,从而影响到索引的选择和使用。