每天学透1个知识点—Oracle性能调优之如何利用索引

什么是索引的“选择性”?为什么有时索引建了却没被使用?

“索引的选择性定义为索引列中不同值的数量与表总行数的比值。选择性越高(越接近1),索引的价值越大,优化器越倾向于使用它。

索引未被使用的原因可能包括:

  1. 选择性差:如果索引列的值大部分相同(如性别列,只有‘男’‘女’),优化器认为通过索引访问还不如直接全表扫描,因此弃用索引。

  2. 统计信息陈旧:如果表的统计信息很久未更新,优化器可能误以为表很小或索引选择性差,从而放弃索引。

  3. SQL写法问题:

    • 对索引列使用了函数(如 WHERE TRUNC(created_date) = ...),会导致无法使用普通索引,除非建立函数索引。

    • 数据类型隐式转换,例如索引列是VARCHAR2,但条件传入的是数字,可能导致索引失效。

  4. CBO估算错误:优化器基于成本计算,可能认为全表扫描的成本低于索引扫描(例如对于小表,索引访问需要额外的回表I/O,成本更高)。

  5. 索引本身状态:索引可能被标记为不可用(UNUSABLE),或存在大量碎片。

解决方法:

  • 对于选择性差的索引,考虑是否需要删除。

  • 更新统计信息。

  • 改写SQL以避免函数或隐式转换。

  • 使用SQL Profile或Hint强制使用索引(谨慎)。”

posted @ 2026-02-26 11:13  一只竹节虫  阅读(24)  评论(0)    收藏  举报