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.

SQL> create table t as select * from dba_users;

Table created.

SQL> create index t_username on t(username);

Index created.

SQL>  exec dbms_stats.gather_table_stats('SYS','T',cascade=>true);

PL/SQL procedure successfully completed.

SQL>

SQL> show parameter optimizer_index_cost_adj

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

现在的index cost=2.

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

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

SQL> select /*+ full(t) */ DEFAULT_TABLESPACE from t where username='CITOSADMIN';

--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 17 | 2 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| T | 1 | 17 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------

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

alter session set optimizer_index_cost_adj = 1000;

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

SQL> select /*+ index(t t_username) */ DEFAULT_TABLESPACE from t where username='CITOSADMIN';

------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 17 | 20 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| T | 1 | 17 | 20 (0)| 00:00:01 |
|* 2 | INDEX RANGE SCAN | T_USERNAME | 1 | | 10 (0)| 00:00:01 |
------------------------------------------------------------------------------------------

所以这个参数就是这样影响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. thinkphp vender

    vender在thinkphp里面时引入系统的类库的意思,具体用法如下. Vendor('Classes.PHPExcel');表示引入vendor目录下的classes文件夹下面的phpexcel文 ...

  2. JSP 向 JavaScript 中传递数组

    采用隐藏标签的方式: // JSP: <%               while(rs.next())       {              %>            <in ...

  3. 设置myeclipse的JSP、HTML的页面编码格式

    JSP编码格式: 点击菜单上的window--->preferences 在弹出的对话框中点击MyEclise--->Files and Editors--->JSP, 在Encod ...

  4. DML和DQL语句

    DML操作: a.插入单行数据:      INSERT INTO 表名(列名,列名,...) VALUE(列值,列值,...); 表的字段名是可选的,如果省略,则一次插入所有字段 多个列表和多个值之 ...

  5. Leetcode0006--ZigZag Conversion

    [转载请注明]https://www.cnblogs.com/igoslly/p/9017638.html 来看一下题目: The string "PAYPALISHIRING" ...

  6. C#入门经典 Chapter5 变量的更多内容

    5.1类型转换 1.类型转换 1.1隐式转换:所有情况下可进行,编译器执行转换. 1.2显示转换 强制转换:强迫数据从一种类型转换为另一种类型. (<destinationType>)&l ...

  7. 提高mysql千万级大数据SQL查询优化几条经验

    凯哥java                             微信号                             kaigejava 功能介绍                    ...

  8. JS高级——逻辑中断

    1.表达式1||表达式2:表达式1为真,返回表达式1:表达式1为假,返回表达式2 2.表达式1&&表达2:表达式1为真,返回表达式2:表达式1为假,返回表达式1

  9. jQuery——自定义动画

    动画方法:animate(json,1000, function (){}) 参数说明:json代表属性设置,1000是动画时间,最后一个是回调函数,其中动画时间可选 属性支持:http://www. ...

  10. jQuery——切换toggle

    toggle()-----显示隐藏 toggleClass-------添加类或者删除类 <!DOCTYPE html> <html lang="en"> ...