`

对参数 optimizer_index_cost_adj 的一点理解_041009

 
阅读更多

OPTIMIZER_INDEX_COST_ADJ
这个初始化参数代表一个百分比,取值范围在1到10000之间.
该参数表示索引扫描和全表扫描成本的比较。缺省值100表示索引扫描成本等价转换与全表扫描成本。

这些参数对于CBO的执行具有重大影响,其缺省值对于数据库来说通常需要调整。
一般来说对于OPTIMIZER_INDEX_CACHING可以设置为90左右
对于大多数OLTP系统,OPTIMIZER_INDEX_COST_ADJ可以设置在10到50之间。对于数据仓库和DSS系统,
可能不能简单的把OPTIMIZER_INDEX_COST_ADJ设置为50,通常我们需要反复调整取得一个合理值.
更为具体的可以根据统计信息,db file scattered reads/db file sequential reads来计算.

本文通过实验对该参数的使用作出探讨和说明.

我们看到optimizer_index_cost_adj的缺省值为100.

 

[oracle@jumper udump]$ sqlplus eygle/eygle

SQL*Plus: Release 9.2.0.3.0 - Production on Mon Jun 28 17:11:15 2004

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Connected to:
Oracle9i Enterprise Edition Release 9.2.0.3.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.3.0 - Production

SQL> show parameter optimizer_index_cost_adj

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
optimizer_index_cost_adj integer 100
SQL>

创建测试表:

 

SQL> create table t as select * from dba_objects;

Table created.

SQL> create index ind_owner on t(owner);

Index created.

SQL> analyze table t compute statistics;

Table analyzed.

 

我们分别观察一下全表扫描和索引访问的成本:

 

SQL> set autotrace traceonly


SQL> select * from t where owner='EYGLE';

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=14 Card=476 Bytes=36652)
1 0 TABLE ACCESS (FULL) OF 'T' (Cost=14 Card=476 Bytes=36652)



SQL> select * from t where owner='EYGLE';

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=16 Card=476 Bytes=36652)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=16 Card=476 Bytes=36652)
2 1 INDEX (RANGE SCAN) OF 'IND_OWNER' (NON-UNIQUE) (Cost=2 Card=476)

 

Oracle在选择不同的访问路径时,会对全表扫描和索引扫描进行比较评估.

在比较的时候,Oracle会把索引扫描的成本转换为全表扫描的成本,和全表扫描的COST进行比较.这个转换需要一个转换因子.
就是optimizer_index_cost_adj:

optimizer_index_cost_adj * (Index Scan Cost) = 等价的 Full Scan Cost

这个 等价的 Full Scan Cost 就是来和全表扫描成本进行比较的.

而这个转换因子的临界值实际上就是Full Scan Cost 和 Index Scan Cost的比值.

即:


optimizer_index_cost_adj = Full Scan Cost / Index Scan Cost

 

SQL> set autotrace off
SQL> select (14/16)*100 from dual;

(14/16)*100
-----------
87.5

1 row selected.

 

我们通过调整optimizer_index_cost_adj来看一下执行计划的变化:

 

SQL> set autotrace traceonly

SQL> alter session set optimizer_index_cost_adj = 87;

Session altered.

SQL> select * from t where owner='EYGLE';

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=14 Card=476 Bytes=36652)
1 0 TABLE ACCESS (BY INDEX ROWID) OF 'T' (Cost=14 Card=476 Bytes=36652)
2 1 INDEX (RANGE SCAN) OF 'IND_OWNER' (NON-UNIQUE) (Cost=2 Card=476)

此时使用索引成本较低.等价全表扫描成本为:

87% * (Index Scan Cost) < Full Scan Cost

此时Oracle选择了索引.

SQL> alter session set optimizer_index_cost_adj = 88;

Session altered.

SQL> select * from t where owner='EYGLE';

Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=14 Card=476 Bytes=36652)
1 0 TABLE ACCESS (FULL) OF 'T' (Cost=14 Card=476 Bytes=36652)

此时使用索引成本较高.等价全表扫描成本为:

88% * (Index Scan Cost) > Full Scan Cost

所以Oracle选择了全表扫描.

分享到:
评论

相关推荐

    Getting The Best From The Cost Based Optimizer

    - **初始化参数**:许多用户认为某些初始化参数可以发挥神奇作用,例如`OPTIMIZER_INDEX_COST_ADJ`。但实际上,这些参数的设置往往需要根据实际场景进行调整。 - `OPTIMIZER_INDEX_COST_ADJ`:此参数在Oracle 8i中...

    Oracle Goldengate性能优化方案

    优化器相关的参数,包括optimizer_index_caching(索引缓存优化器)、optimizer_index_cost_adj(索引成本调整优化器)、optimizer_mode(优化器模式)。 与并行操作有关的参数,比如并行查询的参数、并行DML参数。...

    oracle数据库参数.pdf

    - optimizer_index_cost_adj:调整优化器对索引访问成本的估计。 **9. 系统安全和访问控制** - aq_tm_processes:定义自动队列作业代理线程的进程数。 - dblink_encrypt_login:指示是否加密远程数据库登录。 - ...

    Oracle系统调优详解.docx

    * optimizer_index_cost_adj:在考虑太多或太少索引访问路径的情况下,可以用来优化程序的性能。 * query_rewrite_enabled:启用或禁用实体化视图的查询重写。 * read_only_open_delayed:用于加速某些操作,如:...

    oracle 19c参数

    8. **optimizer_index_cost_adj**:此参数调整索引成本估计,影响查询优化器的选择。适当的调整可能改善查询性能。 9. **shared_pool_size**:共享池存储PL/SQL代码、SQL解析信息等。适当增加大小可以避免"library ...

    Oracle性能优化与故障诊断案例分享

    例如,optimizer_mode和optimizer_index_cost_adj参数的设置可能影响优化器对索引成本的估算。如果在同一会话中,即使使用相同的查询条件,SQL语句的执行速度也会出现时快时慢的现象,这可能是由于基数反馈机制错误...

    Oracle SQL优化

    如optimizer_mode、optimizer_index_cost_adj、optimizer_dynamic_sampling等参数会影响优化器的选择。对这些参数进行调整可以改善查询的性能。 #### SQL语句编写问题 编写高效SQL语句是保证良好性能的关键。包括...

    oracle_sql性能优化

    调整optimizer_index_cost_adj可以影响Oracle选择索引的策略。 八、分析与统计信息 保持统计信息的准确性和时效性对优化至关重要。DBMS_STATS包可用于收集表、索引和其他对象的统计信息,帮助Oracle做出更好的执行...

    Oracle9i的init.ora参数中文说明

    Oracle9i初始化参数中文说明 Blank_trimming: 说明: 如果值为TRUE, 即使源长度比目标长度 (SQL92 兼容) 更长, 也允许分配数据。 值范围: TRUE | FALSE 默认值: FALSE serializable: 说明: 确定查询是否获取表级...

    Oracle高级SQL调优:CLUSTER_FACTOR案例研究

    1. **系统配置**:确认Oracle数据库版本为11.1.0.6,初始化参数`optimizer_index_cost_adj`设置为默认值100。 2. **创建表**: - 创建表TESTCF并填充数据。通过类序列值生成ID列,使用随机函数生成80位长的字符作为...

    数据库优化设计之三十六计

    - **提升索引效率参数**:通过调整`optimizer_index_caching`和`optimizer_index_cost_adj`参数来提高索引搜索效率。 - `optimizer_index_caching`参数控制索引访问的缓存级别,默认值为0,可以将其设置为90以提高...

    优化Oracle库表设计的若干方法

    启用自动统计信息收集,同时监控和调整数据库的自动调优参数,如optimizer_mode和optimizer_index_cost_adj。 8. **物化视图** 对于固定的复杂查询,可以创建物化视图,提前计算结果并存储,提高查询效率。考虑...

    oracle11g新特性--SQL Performance Analyzer

    为了解决这个问题,我们可以参考 Oracle 社区中的专家建议,例如将 `optimizer_index_cost_adj` 参数的值由默认的 100 更改为一个较小的值,如 10。但这样的更改是否对所有 SQL 语句都有利呢? 在 Oracle 11g 之前...

    基于Oracle数据库系统的性能优化与调整研究.pdf

    此外,调整初始化参数如OPTIMIZER_INDEX_COST_ADJ,可以帮助优化器更有效地使用索引。 1.3 使用工具获得执行计划 使用Autotrace、Explain Plan、SQLTrace等工具,可以获取查询执行的详细信息,从而分析出效率低下的...

Global site tag (gtag.js) - Google Analytics