每天学透1个知识点—Oracle性能调优之如何利用索引
什么是索引的“选择性”?为什么有时索引建了却没被使用?
“索引的选择性定义为索引列中不同值的数量与表总行数的比值。选择性越高(越接近1),索引的价值越大,优化器越倾向于使用它。
索引未被使用的原因可能包括:
-
选择性差:如果索引列的值大部分相同(如性别列,只有‘男’‘女’),优化器认为通过索引访问还不如直接全表扫描,因此弃用索引。
-
统计信息陈旧:如果表的统计信息很久未更新,优化器可能误以为表很小或索引选择性差,从而放弃索引。
-
SQL写法问题:
-
对索引列使用了函数(如
WHERE TRUNC(created_date) = ...),会导致无法使用普通索引,除非建立函数索引。 -
数据类型隐式转换,例如索引列是VARCHAR2,但条件传入的是数字,可能导致索引失效。
-
-
CBO估算错误:优化器基于成本计算,可能认为全表扫描的成本低于索引扫描(例如对于小表,索引访问需要额外的回表I/O,成本更高)。
-
索引本身状态:索引可能被标记为不可用(UNUSABLE),或存在大量碎片。
解决方法:
-
对于选择性差的索引,考虑是否需要删除。
-
更新统计信息。
-
改写SQL以避免函数或隐式转换。
-
使用SQL Profile或Hint强制使用索引(谨慎)。”

浙公网安备 33010602011771号