oracle 使用绑定变量性能反而更差?(3)_Oracle数据库_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

oracle 使用绑定变量性能反而更差?(3)

作者:黑客防线网安Oracle维护基地 来源:黑客防线网安Oracle维护基地 浏览次数:0

本篇关键词:Oracle数据库Oracle教程
黑客防线网安网讯:   可以看到,它的成本是336。因此索引的平均成本是(336 * 1003/1000) / 3 ≈ 113,也就是使用绑定变量使的成本。而扫描其它两个值"b"和"a"时代价就非常小。sql> alter system set optimi...

   可以看到它的成本是336因此索引的平均成本是(336 * 1003/1000) / 3 ≈ 113也就是使用绑定变量使的成本而扫描其它两个值"b"和"a"时代价就非常小。
sql> alter system set optimizer_index_cost_adj=100;

system altered.

sql>
sql> delete from plan_table;

3 rows deleted.

sql>
sql> explain plan for select
/*+index(a t_peeking_idx1)*/* from t_peeking a where b = 'b';

explained.

sql>
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;

query
plan_table
---------------------------------------------------------------
select statement cost=2
table access by index rowid t_peeking
index range scan t_peeking_idx1
  因为计算的成本是平均成本(相对实际扫描某个值的成本,平均成本更接近全表扫描成本),因此在创建查询计划时,使用绑定变量将更加容易受到参数optimizer_index_cost_adj影响,特别是上面的这种情况(即索引字段的集的势非常高时)下,平均代价与实际扫描某个值代价相差非常远。这种情况下,optimizer_index_cost_adj对不使用绑定变量查询影响就非常小(因为索引代价不是比全表扫描成本大很多就是小很多),不管扫描哪个值,不使用绑定变量将更加容易选择到合理的查询计划。
  绑定变量窥视
  在了解了参数optimizer_index_cost_adj的作用后。再了解一个对查询计划,特别是使用绑定变量时会产生重大影响的特性:绑定变量窥视(bind variables peeking)。
  绑定变量窥视是9i以后的一个新特性。它使cbo优化器在计算访问代价时,将绑定变量传入的值考虑进去,从而计算出更合理的成本(否则,将会计算平均成本)。看下面例子:
sql> conn sys/sys as sysdba
connected.
sql>
sql> alter system set optimizer_index_cost_adj=60;

system altered.

sql> analyze table t_peeking compute
statistics for table for all indexes for all indexed columns;

table analyzed.

sql>
sql> set autot trace
sql>
sql> alter session set sql_trace = true;

session altered.

sql>
sql> var v char(1)
sql>
sql> exec :v := 'a';

pl/sql procedure successfully completed.

sql>
sql> select * from t_peeking a where b = :v;

1000 rows selected.

sql>
sql> alter session set sql_trace = false;

session altered.
  用tkprof处理生成的trace文件。因为在存在绑定变量窥视时,autotrace或者explain plan可能不会显示正确的查询计划,需要tkprof来处理sql trace。
tkprof fuyuncat_ora_5352.trc aaa.txt
  此时optimizer_index_cost_adj是60,根据上面的结论,似乎查询计划应该选择扫描索引。但是,这里给绑定变量赋了值"a",这时,优化器会“窥视”到这个值,并且在计算扫描成本时按照这个值的成本来计算。因此,得出的查询计划是全表扫描,而不是扫描索引,靠tkprof分析的结果:

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-13188-1.html
网站维护教程更新时间:2012-03-23 00:51:35  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer