Oracle在选择不同的访问路径时,会对全表扫描和索引扫描进行比较评估. 在比较的时候,Oracle会把索引扫描的成本转换为全表扫描的成本,和全表扫描的COST进行比较.这个转换需要一个转换因子. 就是optimizer_index_cost_adj:  optimizer_index_cost_adj * (Index Scan Cost) = 等价的 Full Scan Cost。

所以 optimizer_index_cost_adj = 等价的 Full Scan Cost  /  Index Scan Cost。

我们来做个试验,看是不是这样的。我们先创建一个表,建立索引然后收集统计信息。然后看一下默认的optimizer_index_cost_adj=100. 但这里存的其实是百分数,所以真正的optmizer_index_cost_adg=1.

  1. SQL> create table t as select * from dba_users;
  2.  
  3. Table created.
  4.  
  5. SQL> create index t_username on t(username);
  6.  
  7. Index created.
  8.  
  9. SQL> exec dbms_stats.gather_table_stats('SYS','T',cascade=>true);
  10.  
  11. PL/SQL procedure successfully completed.
  12.  
  13. SQL>
  14.  
  15. SQL> show parameter optimizer_index_cost_adj
  16.  
  17. NAME TYPE VALUE
  18. ------------------------------------ --------------------------------- ------------------------------
  19. optimizer_index_cost_adj integer 100
  20. SQL>

现在的index cost=2.

  1. SQL> set linesize 180
  2. SQL> set autotrace traceonly
  3. SQL> select DEFAULT_TABLESPACE from t where username='CITOSADMIN';
  4. ------------------------------------------------------------------------------------------
  5. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  6. ------------------------------------------------------------------------------------------
  7. | 0 | SELECT STATEMENT | | 1 | 17 | 2 (0)| 00:00:01 |
  8. | 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 17 | 2 (0)| 00:00:01 |
  9. |* 2 | INDEX RANGE SCAN | T_USERNAME | 1 | | 1 (0)| 00:00:01 |
  10. ------------------------------------------------------------------------------------------

现在的full table scan cost 也是等于2

  1. SQL> select /*+ full(t) */ DEFAULT_TABLESPACE from t where username='CITOSADMIN';
  2.  
  3. --------------------------------------------------------------------------
  4. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  5. --------------------------------------------------------------------------
  6. | 0 | SELECT STATEMENT | | 1 | 17 | 2 (0)| 00:00:01 |
  7. |* 1 | TABLE ACCESS FULL| T | 1 | 17 | 2 (0)| 00:00:01 |
  8. --------------------------------------------------------------------------

我们设置该参数为1000,因为存储的是百分数,所以现在真正的optimizer_index_cost_adg=10;

alter session set optimizer_index_cost_adj = 1000;

现在index 的cost变成了:20=2*10

  1. SQL> select /*+ index(t t_username) */ DEFAULT_TABLESPACE from t where username='CITOSADMIN';
  2.  
  3. ------------------------------------------------------------------------------------------
  4. | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
  5. ------------------------------------------------------------------------------------------
  6. | 0 | SELECT STATEMENT | | 1 | 17 | 20 (0)| 00:00:01 |
  7. | 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 17 | 20 (0)| 00:00:01 |
  8. |* 2 | INDEX RANGE SCAN | T_USERNAME | 1 | | 10 (0)| 00:00:01 |
  9. ------------------------------------------------------------------------------------------

所以这个参数就是这样影响CBO的执行计划的。

optimizer_index_cost_adj的更多相关文章

  1. 关于Optimizer_index_cost_adj参数的设置

    Thomas建议:对于许多系统,应到考虑设置这两个参数为非默认值,至少测试一下两种极端情形: 1. optimizer_index_caching=0 和 optimizer_index_cost_a ...

  2. OPTIMIZER_INDEX_COST_ADJ 与OPTIMIZER_INDEX_CACHING 参数说明

    [部分转载]http://www.xifenfei.com/2012/06/optimizer_index_caching和optimizer_index_cost_adj参数说明.html 1. O ...

  3. Oracle的优化器介绍

    Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. RBO优化器 ...

  4. 【转载】我眼中的Oracle性能优化

    我眼中的Oracle性能优化 大家对于一个业务系统的运行关心有如下几个方面:功能性.稳定性.效率.安全性.而一个系统的性能有包含了网络性能.应用性能.中间件性能.数据库性能等等. 今天从数据库性能的角 ...

  5. ORACLE10gRAC数据库迁移至10gRAC

    1.数据库备份RUN {ALLOCATE CHANNEL ch00 DEVICE TYPE disk;ALLOCATE CHANNEL ch01 DEVICE TYPE disk;ALLOCATE C ...

  6. 如何读懂 STATSPACK 报告 (转) & Toad 结合

    可与 toad 相结合的内容, 用 这种颜色可以利用 toad(database->monitor->server statistics)查看到下边的很多信息, 比如 wait event ...

  7. PLSQL_性能优化系列16_Oracle Tuning Analyze优化分析

    2014-12-23 Created By BaoXinjian

  8. PLSQL_性能优化系列04_Oracle Optimizer优化器

    2014-09-25 Created By BaoXinjian

  9. Oracle优化器介绍

    Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. RBO优化器 ...

随机推荐

  1. [Swift通天遁地]九、拔剑吧-(6)使用开源类库快速搭建强大的侧边栏项目

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  2. python3+request接口自动化框架

    首次书写博客,记录下写的自动化接口框架,框架比较简单,哈哈哈,算是记录下历程把!~~~ 一.本次框架由python3.6 书写 1.准备代码环境,下载python3.6    下载地址:https:/ ...

  3. myeclipse配置tomcat后,无法正常使用的问题

    如图所示:一定要设置为Enable.否则部署tomcat时,没有tomcat8.0

  4. Linux egrep命令

    Linux egrep命令用于在文件内查找指定的字符串. egrep执行效果与"grep-E"相似,使用的语法及参数可参照grep指令,与grep的不同点在于解读字符串的方法. e ...

  5. Spring Boot (24) 使用Spring Cache集成Redis

    Spring 3.1引入了基于注解(annotation)的缓存(cache)技术,它本质不是一个具体的缓存实现方案,而是一个对缓存使用的抽象,通过在既有代码中添加少量它定义的个助攻annotatio ...

  6. MVC系列学习(零)-本次学习可能会遇到的问题汇总

    1.命名空间"System.Web"中不存在类型或命名空间名称"Optimization"(是否缺少程序集引用?) 在 区域学习(十六),遇到了个错误,如下 解 ...

  7. Android Studio 关于build.gradle配置问题

    当导入一个Android Project时,会出现很多版本的问题,导入前先删除 .idea文件 .gradle文件 ,gradle文件(与.gradle区分,导入时Android Studio会提示重 ...

  8. drupal 8——在CKEditor中导入video media时添加caption会导致video缩小至消失

    在CKEditor中,我点击media browser,选择video型的media,并在caption中输入video的名字.当我保存后发现在前台页面的video消失了,只留下video的名字,点击 ...

  9. React Native导航器Navigator

    React Native导航器Navigator 使用导航器可以让你在应用的不同场景(页面)间进行切换.导航器通过路由对象来分辨不同的场景.利用renderScene方法,导航栏可以根据指定的路由来渲 ...

  10. Mongodb 重置密码或创建用户

    1.关闭mongodb  服务 win+r  输入services.msc 回车 找到MongoDB  关闭掉 2.进入到 win +r  输入cmd  进入命令窗口 在进入到mongodb 的安装目 ...