- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)