数据库参数OPTIMIZER_INDEX_COST_ADJ的一段故事
今天在做一个SQL语句的优化,突然间想起了一个参数OPTIMIZER_INDEX_COST_ADJ。
故事是这样的,当时有个物流行业的DBA来找我,问一个简单的SQL语句怎么不走索引,他查了一圈,没找到问题。
我看了一下,就是一个简单的单表查询,排查了一遍,没看到什么异常。我就问他,大概是从什么时候开始出现这个问题?
然后我通过他提供的时间,然后查看了DB TIME,发现从他说的这个时间点开始,DBTIME有明显的增幅。
然后查看了alert日志,发现有人把OPTIMIZER_INDEX_COST_ADJ修改成了2000。
用会话级别把OPTIMIZER_INDEX_COST_ADJ改回100后,验证就正常了。
后面还有一段故事,就不细说了。
下面就是OPTIMIZER_INDEX_COST_ADJ参数的介绍。
OPTIMIZER_INDEX_COST_ADJ
功能说明:
OPTIMIZER_INDEX_COST_ADJ 参数用于调整优化器在选择访问路径时的行为,使其更倾向于或更不倾向于使用索引访问。
参数属性:
| 属性 | 描述 |
|---|---|
| 参数类型 | 整数(Integer) |
| 默认值 | 100 |
| 是否可修改 | 可通过 ALTER SESSION 或 ALTER SYSTEM 修改 |
| 是否可在PDB中修改 | 是 |
| 取值范围 | 1 到 10000 |
| 是否为基础参数 | 否 |
详细说明:
该参数的默认值为 100,表示优化器以正常成本评估索引访问路径。
如果设置为其他值,优化器会按该百分比的成本来评估索引访问路径。例如:
- 设置为 50 时,索引访问路径的成本被视为正常成本的一半,从而使优化器更倾向于选择索引。
- 设置为 200 时,索引访问路径的成本被视为正常成本的两倍,从而使优化器更不倾向于选择索引。
注意:
此调整不适用于用户自定义的域索引(domain indexes)成本函数。
总结:
OPTIMIZER_INDEX_COST_ADJ 是一个用于微调优化器行为的参数,通过“人为地”降低或提高索引访问路径的“估算成本”,来影响SQL执行计划的选择。常用于优化器未选择理想索引时的手动干预。
修改该参数一定要慎重考虑,我的建议是不要改,影响太大,很难评估。
