码迷,mamicode.com
首页 > 其他好文 > 详细

关于游标共享测试和总结

时间:2016-06-26 19:43:45      阅读:148      评论:0      收藏:0      [点我收藏+]

标签:

游标共享的前提条件是sql文本要完全相同。

如下sql语句中

s1: select * from t1 where object_id=4;

s2: select * from T1 where object_id=4;

s3 :select * from t1 where object_id=4;

s4: select * from  t1 where object_id=4;

s2的表名(t1)大写与s1的表名(t1)小写不能算作同一个语句,s4 中t1 之前有空格,所以与其它语句也不会相同,s1和s3完全一样,所以它们是同一条语句。

创建测试表

SQL>create table t1 as select * from    dba_objects;
SQL>create index idx_t1 on t1(object_id);
SQL> select count(*) from t1;

  COUNT(*)
----------
     91044

注:oracle  在sql硬解析之前首先会将对sql语句生成散列值,进而在库缓存中去搜索,如果能找到,则说明语句之前有执行过,这时语句有一个可共享的父游标。

执行上述4条语句,然后查询v$sqlarea

select sql_id,sql_text,executions from v$sqlarea where sql_text like  ‘%=4‘;

SQL_ID	      SQL_TEXT												   EXECUTIONS
------------- ---------------------------------------------------------------------------------------------------- ----------
0msd0jqtz1fta select * from t1 where object_id=4									    2
cq9uku9a36w3j select * from  t1 where object_id=4									    2
b472gkg0mgbzv  select * from T1 where object_id=4									    1

由此可证明由于语句大大小写以及空格等原因,生成了了三个父游标。  

子游标能够共享的前提是优化器环境,用户模式等需要完全一致

下面以不同的优化器模式执行s1 

SQL> alter session set optimizer_mode = all_rows;

Session altered.

SQL> select * from t1 where object_id=4;
结果略
SQL> alter session set optimizer_mode = first_rows;

Session altered.

SQL> select * from t1 where object_id=4;
结果略

查询v$sql 试图

SQL> select sql_id,child_number,optimizer_mode,plan_hash_value from v$sql where sql_text=‘select * from t1 where object_id=4‘;

SQL_ID	      CHILD_NUMBER OPTIMIZER_ PLAN_HASH_VALUE
------------- ------------ ---------- ---------------
0msd0jqtz1fta		 0 ALL_ROWS	   3983389365
0msd0jqtz1fta		 1 FIRST_ROWS	   3983389365

可以看到同父游标(sql_id相同)下有两个子游标,优化器环境不同导致优化器生成两个子游标, PLAN_HASH_VALUE这一列相同说明两个子游标共享相同的执行计划。

 

关于游标共享测试和总结

标签:

原文地址:http://www.cnblogs.com/wangxingc/p/5618380.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!