网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > 数据库技术 > Oracle > PL/SQL > OPTIMIZER_INDEX_COST_ADJ与成本计算  

OPTIMIZER_INDEX_COST_ADJ与成本计算

2005-12-03  作者:BitsCN整理  来源:中国网管联盟  点评 投稿 收藏


  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.
网管网www_bitscn_com

  
  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.
  
  我们分别观察一下全表扫描和索引访问的成本:
  
网管论坛bbs_bitsCN_com

  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 /*+ index(t ind_owner) */ * 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进行比较.这个转换需要一个转换因子.

网管u家www.bitscn.net


  
  就是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';

网管bitscn_com


  
  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)
  
  此时使用索引成本较高.等价全表扫描成本为:
  
网管下载dl.bitscn.com

  88% * (Index Scan Cost) > Full Scan Cost
  
  所以Oracle选择了全表扫描.
TAGs   计算   成本   Cost   SQL   扫描   Scan   Card   全表   索引   optimizer_index_cost_adj    
 上一篇:如何使用Oracle的Decode函数进行多值判断   下一篇:如何使用Oracle case函数
相关文章列表
OPTIMIZER_INDEX_COST_ADJ与成本计算 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
1.PL/SQL - 嵌套游标 cursor-PLSQL
2.用一个实例讲解Oracle数据库的PL/SQL语句
3.PL/SQL----触发器-PLSQL
4.mysql存储过程写法—动态参数运用-PLSQL
5.PL/SQL Developer导出分区索引脚本-PLSQL
6.PL/SQL collection— table() 函数-PLSQL
7.SQL Server 2005 中的架构与用户-PLSQL
8.Oracle数据库维护常用SQL语句集合(2)-P
9.Oracle数据库维护常用SQL语句集合(3)-P
10.再议SQL Server临时表和表变量-PLSQL
最新推荐文章:
1.与数据库无关的处理放到数据库以外来实现
2.Oracle 10g第2版新特性之SQL和PL/SQL
3.通过PL/SQL访问Web Services
4.菜鸟学oracle - 用PL/SQL画直方图
5.重新编译PLSQL中无效对象或指定对象
6.Oracle高级技巧
7.深入了解Oracle 10g新的多重集运算符
8.在SQL中删除重复记录(多种方法)
9.Oracle:PL/SQL中怎样使用Array
10.数据库手册:速查Oracle函数列表
网管论坛交流:
·大家来开心一下吧---看了会很开心的东西-
·中国人不可不知道的知识
·@@小鹏◎◎小鹏同志与某位女明星亲密接触
·◎◎小鹏◎◎发现不明生物,居然正在交配
·[图文]^^^版主是什么?????
·泡论坛的女人是好女人
·做个“水性杨花”的女人
·献给mm俱乐部的所有mm
·深圳一集团企业电脑基础应用培训教程
·■■■■十一遊玩照■■■■■