设为首页 加入收藏

TOP

Oracle11g新特性之动态变量窥视(二)
2015-11-21 02:03:19 来源: 作者: 【 】 浏览:4
Tags:Oracle11g 特性 动态 变量 窥视
----- \| 0 | SELECT STATEMENT | | | | 11 ( 100) | \| 1 | TABLE ACCESS BY INDEX ROWID| T1 | 1365 | 28665| 11 ( 0) | 00: 00: 01 \|* 2 | INDEX RANGE SCAN | IDX_T1 | 1365 | | 3 ( 0) | 00: 00: 01 \-------------------------------------------------------------------------------- \...... \hr@ora10g> exec :v_id := 1; \hr@ora10g> select * from t1 where id=:v_id; \此处省略查询结果 \hr@ora10g > begin \ 2 select sql_id into :v_sql_id from v$sql \ 3 where sql_text like 'select * from t1 where id=:v_id%'; \ 4 end; \ 5 / \hr@ora10g > select * from table(dbms_xplan.display_cursor(:v_sql_id)); \PLAN_TABLE_OUTPUT \-------------------------------------------------------------------------------- \SQL_ID djwq30cpbcz7k, child number 0 \------------------------------------- \select * from t1 where id=:v_id \Plan hash value: 50753647 \-------------------------------------------------------------------------------- \| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time \-------------------------------------------------------------------------------- \| 0 | SELECT STATEMENT | | | | 11 ( 100) | \| 1 | TABLE ACCESS BY INDEX ROWID| T1 | 1365 | 28665| 11 ( 0) | 00: 00: 01 \|* 2 | INDEX RANGE SCAN | IDX_T1 | 1365 | | 3 ( 0) | 00: 00: 01 \-------------------------------------------------------------------------------- \

从上面结果可以看出,在为绑定变量传入第一个值为13871时,由于返回的记录条数较少,导致走索引扫描。当我们第二次传入绑定变量值1时,oracle不再生成新的执行计划,而直接拿索引扫描的执行路径来用。

但是,如果先传入1的绑定变量值,然后再传入13871的绑定变量值时,会怎样?我们继续测试。

hr@ora10g> alter system flush shared_pool;
hr@ora10g> set autotrace traceonly exp stat;
hr@ora10g> exec :v_id := 1;
hr@ora10g> select * from t1 where id=:v_id;
hr@ora10g > begin
2 select sql_id into :v_sql_id from v$sql
3 where sql_text like 'select * from t1 where id=:v_id%';
4 end;
5 /
hr@ora10g > select * from table(dbms_xplan.display_cursor(:v_sql_id));
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------- 
SQL_ID djwq30cpbcz7k, child number 0
------------------------------------- 
select * from t1 where id=:v_id
Plan hash value: 3617692013
-------------------------------------------------------------------------- 
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT | | | | 13 (100)| |
|* 1 | TABLE ACCESS FULL | T1 | 8738 | 179K | 13 (0) | 00:00:01 |
-------------------------------------------------------------------------- 
......
hr@ora10g > exec :v_id := 13871;
hr@ora10g > select * from t1 where id=:v_id;
hr@ora10g > begin
2 select sql_id into :v_sql_id from v$sql
3 where sql_text like 'select * from t1 where id=:v_id%';
4 end;
5 /
hr@ora10g > select * from table(dbms_xplan.display_cursor(:v_sql_id));
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------------------- 
SQL_ID djwq30cpbcz7k, child number 0
------------------------------------- 
select * from t1 where id=:v_id
Plan hash value: 3617692013
-------------------------------------------------------------------------- 
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-------------------------------------------------------------------------- 
| 0 | SELECT STATEMENT | | | | 13 (100)| |
|* 1 | TABLE ACCESS FULL | T1 | 8738 | 179K | 13 (0) | 00:00:01 |
----------
首页 上一页 1 2 3 4 5 下一页 尾页 2/5/5
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2014年末回顾-总结-oracledba的成.. 下一篇oracle学习之路(五)-----oracle数..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: