欢迎来到天天文库
浏览记录
ID:6335924
大小:76.00 KB
页数:10页
时间:2018-01-10
《什么时候使用绑定变量性能反而更差》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、什么时候使用绑定变量性能反而更差作者:fuyuncat来源:www.HelloDBA.com当我在做培训时,在解释绑定变量的好处时,大家都比较容易理解。但是,对于并不是任何时候绑定变量都是最优的。这一点很多人不是和理解。下面就讨论一下在什么时候会出现绑定变量会使性能变差。扫描成本和OPTIMIZER_INDEX_COST_ADJ我们知道,在CBO模式下,Oracle会计算各个访问路径的代价,采用最小代价的访问路径作为语句的执行计划。而对于索引的访问代价的计算,需要根据一个系统参数OPTIMIZER_INDEX_COST_ADJ来转换为与全表扫描代价等价的一个值。这是什么意思呢?我们先稍微解释
2、一下这个参数:OPTIMIZER_INDEX_COST_ADJ。它的值是一个百分比,默认是100,取值范围是1~10000。当估算索引扫描代价时,会将索引的原始代价值乘以这个百分比,将换算后的值作为与全表扫描代价比较的值。也就是说,当这个值为100时,计算出的索引扫描代价就是它的原始代价:COST_COM=COST_ORG*OPTIMIZER_INDEX_COST_ADJ/100看以下例子:SQL>createtableT_PEEKING(aNUMBER,bchar(1),cchar(2000)); Tablecreated. SQL>SQL>createindexT_PEEKING_IDX
3、1onT_PEEKING(b); Indexcreated. SQL>begin 2 foriin1..1000loop 3 insertintoT_PEEKINGvalues(i,'A',i); 4 endloop; 5 6 insertintoT_PEEKINGvalues(1001,'B',1001); 7 insertintoT_PEEKINGvalues(1002,'B',1002); 8 insertintoT_PEEKINGvalues(1003,'C',1003); 910 commit;11 end;12 / PL/SQLprocedure
4、successfullycompleted. 注意,我们给索引字段B插入的值中只有3个distinct值,记录数是1003,它的集的势很高(1003/3)=334。关于集的势的计算,可以参考我的另外一篇文档《关于集的势的计算》。 SQL>SQL>analyzetableT_PEEKINGcomputestatisticsfortableforallindexesforallindexedcolumns; Tableanalyzed. SQL>我们看下索引扫描的代价是多少:SQL>showparameterOPTIMIZER_INDEX_COST_ADJ NAME
5、 TYPE VALUE-----------------------------------------------------------------------------optimizer_index_cost_adj integer 100 SQL>deletefromplan_table; 0rowsdeleted. SQL>explainplanforselect/*+index(aT_PEEKING_IDX1)*/*fromT_PEEKINGawhereb=:V; Explained. SQL>selec
6、tlpad('',2*(level-1))
7、
8、operation
9、
10、''
11、
12、options
13、
14、''
15、
16、 2 object_name
17、
18、''
19、
20、decode(id,0,'Cost='
21、
22、position)"Query 3 Plan_Table" 4 fromplan_table 5 startwithid=0 6 connectbypriorid=parent_id 7 ; QueryPlan_Table-----------------------------------------------------------------------------
23、---SELECTSTATEMENT Cost=113 TABLEACCESSBYINDEXROWIDT_PEEKING INDEXRANGESCANT_PEEKING_IDX1 SQL> 再看全表扫描的代价是多少:SQL>deletefromplan_table; 3rowsdeleted. SQL>SQL>explainplanforselect/*+full(a)*/*fromT_PEEKINGa
此文档下载收益归作者所有