网站大量收购独家精品文档,联系QQ:2885784924

什么时候使用绑定变量性能反而更差.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
什么时候使用绑定变量性能反而更差

什么时候使用绑定变量性能反而更差 fuyuncat 来源: www.HelloDBA.com 当我在做培训时,在解释绑定变量的好处时,大家都比较容易理解。但是,对于并不是任何时候绑定变量都是最优的。这一点很多人不是和理解。下面就讨论一下在什么时候会出现绑定变量会使性能变差。 扫描成本和OPTIMIZER_INDEX_COST_ADJ 我们知道,在CBO模式下,Oracle会计算各个访问路径的代价,采用最小代价的访问路径作为语句的执行计划。而对于索引的访问代价的计算,需要根据一个系统参数OPTIMIZER_INDEX_COST_ADJ来转换为与全表扫描代价等价的一个值。这是什么意思呢?我们先稍微解释一下这个参数:OPTIMIZER_INDEX_COST_ADJ。它的值是一个百分比,默认是100,取值范围是1~10000。当估算索引扫描代价时,会将索引的原始代价值乘以这个百分比,将换算后的值作为与全表扫描代价比较的值。也就是说,当这个值为100时,计算出的索引扫描代价就是它的原始代价: COST_COM = COST_ORG * OPTIMIZER_INDEX_COST_ADJ/100 看以下例子: SQL create table T_PEEKING (a NUMBER, b char(1), c char(2000)); ? Table created. ? SQL SQL create index T_PEEKING_IDX1 on T_PEEKING(b); ? Index created. ? ? SQL begin ? 2??? for i in 1..1000 loop ? 3????? insert into T_PEEKING values (i, A, i); ? 4??? end loop; ? 5 ? 6??? insert into T_PEEKING values (1001, B, 1001); ? 7??? insert into T_PEEKING values (1002, B, 1002); ? 8??? insert into T_PEEKING values (1003, C, 1003); ? 9 10??? commit; 11? end; 12? / ? PL/SQL procedure successfully completed. ? 注意,我们给索引字段B插入的值中只有3个distinct值,记录数是1003,它的集的势很高(1003/3)=334。关于集的势的计算,可以参考我的另外一篇文档《关于集的势的计算》。 ? SQL SQL analyze table T_PEEKING compute statistics for table for all indexes for all indexed columns; ? Table analyzed. ? SQL 我们看下索引扫描的代价是多少: SQL show parameter OPTIMIZER_INDEX_COST_ADJ ? NAME???????????????????????????????? TYPE??????? VALUE ------------------------------------ ----------- ------------------------------ optimizer_index_cost_adj???? ????????integer???? 100 ? SQL delete from plan_table; ? 0 rows deleted. ? ? SQL explain plan for select /*+index(a T_PEEKING_IDX1)*/ * from T_PEEKING a where b = :V; ? Explained. ? SQL select lpad( , 2*(level-1))||operation|| ||options|| || ? 2??? ?????object_name|| ||decode(id, 0, Cost=||position) Query ? 3? Plan_Table ? 4????? from plan_table ? 5????? start with id = 0 ? 6????? connect by prior id = parent_id ? 7? ; ? Query Plan_Table -------------------------------------------------------------------------------- SELECT STATEMENT??

文档评论(0)

xjj2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档