IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:optimizer

共 1 篇相关文章

IT 累计浏览 2,500

为什么Oracle不使用我的索引?!

这篇讲的是一个典型的 Oracle 索引失效问题,但根因却藏在统计信息里。作者在分析一个真实案例时发现,开发者明明在查询条件中使用了索引列,且 `SELECT` 了需要的字段,Oracle 却总是顽固地选择全表扫描。 深入诊断后发现问题出在 CBO(基于成本的优化器)所依赖的统计信息上。由于表上的列分布发生了剧烈变化(例如一个10G的表上跑了半年的DDL),旧的统计信息与现实严重不符,导致优化器对索引选择性的估算出现了致命偏差。更有趣的是,文中还提到了 `cardinality feedback` 这个机制,它在首次硬解析时选择了全表扫描,并在软解析时“锁死”了这个错误的执行计划,让问题变得更加隐蔽。 解决方法看似简单却容易被忽视:及时使用 `DBMS_STATS` 包刷新相关对象的统计信息,让优化器能基于准确的“地图”来规划路径。这个案例提醒我们,当索引“不工作”时,除了检查查询写法和索引本身,数据库的统计信息健康状态是必须排查的关键环节。