关于Oracle9i的Peeking of User-Defined Bind Variables
我们知道,由于使用绑定变量,在Oracle9i之前会导致柱状图信息无法被用到
从Oracle9i开始Oracle提供了Peeking的方式,在使用绑定变量的SQL第一次执行时,使用参数传递成文本sql,此时可以有效的利用
存在的柱状图信息进行执行计划的评估,从而在某些数据分布不均和的情况下,可能可以产生更为精确的执行计划.这显然是一个有
益的提高,然而这个Peeking有时候也会存在问题,本文通过实例说明这个特性及其不足.
以下是完整的测试验证过程:
[oracle@jumper oracle]$ sqlplus eqsp/eqsp
SQL*Plus: Release 9.2.0.3.0 - Production on Thu Nov 20 23:13:20 2003
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
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>
SQL>
SQL> drop table t;
Table dropped.
SQL> create table t as select 1 id,a.* from dba_objects a;
Table created.
SQL> insert into t select * from t;
10168 rows created.
SQL> /
20336 rows created.
SQL> commit;
Commit complete.
SQL> select count(*) from t;
COUNT(*)
----------
40672
SQL> update t set id = 99 where rownum <2; --构造试验数据,id=99的纪录只有一条.其余id=1
1 row updated.
SQL> commit;
Commit complete.
SQL> create index t_ind1 on t(id);
Index created.
SQL> analyze table t compute statistics for table for all indexed columns;
Table analyzed.
SQL> exit
|
测试脚本
|
[oracle@jumper oracle]$ vi eygle.sql
set term off
set head off
alter session set sql_trace = true;
select * from t where id = :v;
alter session set sql_trace = false;
~
~
~
"eygle.sql" [ò?×a??] 6L, 131C ò?D′è?
[oracle@jumper oracle]$ more eygle2.sql
set term off
set head off
alter session set sql_trace = true;
select * from t n_1 where id = :v;
alter session set sql_trace = false;
|
第一步测试:
|
SQL> var v number -----------由于柱状图信息生效,此处使用了全表扫描
|
|
SQL> exec :v :=99 ---id=99的记录只有一条,此处应该使用索引 ---------由于不再进行Peeking,所以这里仍然使用了全表扫描,这是错误的选择
|
第二步测试
|
Connected to:
|
|
[oracle@jumper udump]$ tkprof hsjf_ora_15042.trc 3.log
|
|
SQL> exec :v :=1
|
- 2019-09-16 PostgreSQL 基础:行列转换实现类MySQL的 group_concat 功能
- 2019-09-16 PostgreSQL 基础:如何查看 PostgreSQL 中SQL的执行计划
- 2018-09-16 Oracle 的 X$ 表之:x$kqfta 内核SQL固定表信息
- 2010-09-16 Oracle PSU (Patch Set Update) 笔记
- 2009-09-16 SUN + Oracle推出Exadata 2 终止与HP的合作
- 2009-09-16 CBO的魔术 - 一个错误的索引选择会带来的后果
- 2008-09-16 《深入浅出Oracle》被某大学选为教材
- 2007-09-16 结束IT168《循序渐进Oracle》技术交流会
- 2005-09-16 Tom's New book has landed
请问盖老师
绑定变量的这个问题现在已经开始严重影响到我们的系统。
最开始所有的查询都是使用的绑定变量。随着数据量的增多,第一次窥视出来的结果已经不能满足每次查询。导致特定值时查询很快,其他值时查询慢的一沓糊涂。
为了解决这个问题。我们用动态SQL重写了大约5%的最常用查询语句。查询速度倒是提高了不少,但是用TOAD看SQL AREA HIT RATE 居然降低到了6X%。。
那么您认为这个问题在10.2.0上有什么好的解决方法呢(升级到11g就先不考虑了)
可以动态写程序,计算统计信息的选择行,然后在执行的前加HINT。