optimizer_index_cost_adj

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,布布扣,bubuko.com

时间: 2024-10-11 03:56:23

optimizer_index_cost_adj的相关文章

optimizer_index_caching和optimizer_index_cost_adj两个参数说明

一.optimizer_index_cost_adj参数 优化器计算通过索引扫描访问表数据的cost开销,可以通过这个参数进行调整.参数可用值的范围为1到10000.默认值为100,超过100后越大则越会使索引扫描的COST开销越高(计算的),从而导致查询优化器更加倾向于使用全表扫描.相反,值越小于100,计算出来的索引扫描的开销就越低. 注意: 1.这里描述的开销,仅仅为优化器评估出来的而已,而非实际执行的开销:例如同样的SQL语句,同样的执行路径,修改这个参数以后,计算出来的cost不同,但

固定执行计划-使用coe_xfr_sql_profile

一.历史执行计划固定 历史的执行计划找到一个合理的执行计划进行绑定 1. 存在多个执行计划的语句,按照索引是比较合适的,FULL SCAN不合适 select * from scott.emp where deptno=30 select * from table(dbms_xplan.display_cursor('4hpk08j31nm7y',null)) SQL_ID 4hpk08j31nm7y, child number 0 -------------------------------

所有_show parameters

SYS AS [email protected]>SHOW PARAMETER; NAME                     TYPE     VALUE------------------------------------ ----------- ------------------------------O7_DICTIONARY_ACCESSIBILITY         boolean     FALSEactive_instance_count             inte

(转载)Oracle AWR报告指标全解析

Oracle AWR报告指标全解析 2014-10-16 14:48:04 分类: Oracle [性能调优]Oracle AWR报告指标全解析 2013/08/31 BY MACLEAN LIU 26条评论 [性能调优]Oracle AWR报告指标全解析 开Oracle调优鹰眼,深入理解AWR性能报告:http://www.askmaclean.com/archives/awr-hawk-eyes-training.html 开Oracle调优鹰眼,深入理解AWR性能报告 第二讲: http:

为何在查询中索引未被使用 (Doc ID 1549181.1)

* 为何在查询中索引未被使用 (Doc ID 1549181.1) To Bottom 文档内容 用途   排错步骤   快速检查   表上是否存在索引?   索引是否应该被使用?   索引本身的问题   索引列或者索引的前置列是否在单表(non-join)查询的 Where 条件中(predicate list)?   索引列是否用在连接谓词中(join predicates)?   索引列在 IN 或者多个 OR 语句中?   索引列是否被函数修改?   隐式类型转换(implicit ty

谈一下oracle索引

索引的应用:索引的分类:逻辑分类:单列索引 & 复合列索引create index i_emp_ename on emp (ename);create index i_emp_3 on emp (empno,ename,sal);非唯一键索引 & 唯一键索引create unique index i_emp_ename on emp (ename);基于函数的索引create index i_emp_ename on emp (lower(ename));应用程序域索引: oracle查看

详解 db file sequential read 等待事件

db file sequential read (本文由thomaswoo_dba翻译,转载请注明出处) db file sequential read 事件有三个参数:file#,first block#, block count, 在oracle 10g里,此等待事件在归于 User I/O wait class 下面的. 处理db file sequential read 事件要牢牢把握下面三个主要思想: 1)oracle 进程需要访问的block不能从SGA 中获取,因此oracle 进

AWR Report 关键参数详细分析

WORKLOAD REPOSITORY report for DB Name DB Id Instance Inst num Startup Time Release RAC CALLDB 1251068085 calldb1 1 07-Dec-12 21:12 11.2.0.3.0 YES Host Name Platform CPUs Cores Sockets Memory (GB) calldb01 AIX-Based Systems (64-bit) 128 32   250.25  

如何读懂 STATSPACK 报告 (转)

详细解读 STATSPACK 报告 1.报表头信息 2.实例负载档信息 ** (部分重要参数) 3.实例有效性信息 *** (全部) 4.TOP 5及其他等待事件信息 *** 5.SQL统计信息 *** (只确认部分语句, 我们自己写的) 对于一个特定的应用程序或者系统来讲,要调整优化其性能,最好的方法是检查程序的代码和用户使用的SQL语句.如果使用了 level5级别的snapshot, 那么statspack生成的报告就会显示系统中高负荷SQL语句(High Load SQL)的信息, 缺省