关于游标共享测试和总结

游标共享的前提条件是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这一列相同说明两个子游标共享相同的执行计划。

时间: 2024-12-09 13:35:42

关于游标共享测试和总结的相关文章

【Oracle 优化器】自适应游标共享(Adaptive Cursor Sharing)功能

概述 我们知道,由于绑定变量窥视(Bind Peeking)功能,SQL文在进行硬解析(Hard Parse)时,会代入绑定变量的值来估算选择基数(cardinality )并做成执行计划,而相同的SQL文以后在执行过程中,都会共享初次执行时做成的执行计划. 如果表的数据分布不均或者数据倾斜时,用于估算的变量值和以后执行中的用到的变量值估算选择基数(cardinality )差异很大时,通过绑定变量窥视(Bind Peeking)功能做成的执行计划,针对某些变量值的执行可能都是最优的,甚至可能引

11g新特性之自适应游标共享(Adaptive Cursor Sharing)

自适应游标共享会使包含绑定变量的单个语句拥有多个执行计划,所谓自适应是指执行计划会依据绑定变量的具体值而适配一个最适合该值的执行计划. 隐藏参数_optimizer_adaptive_cursor_sharing=TRUE 开启或关闭此特性. 首先:游标是否可以被ACS使用,首先游标必须是绑定变量敏感的游标,也就是说最优的执行计划会依赖于绑定变量具体的值.数据库会监控绑定变量敏感的游标,观察是否不同的执行计划会对不同的绑定变量值有好处. 游标在以下两个条件满足的时候会被标记为绑定变量敏感的游标:

nginx整合tomcat集群并做session共享----测试案例

最近出于好奇心,研究了一下tomcat集群配置,并整合nginx,实现负载均衡,session共享,写篇记录,防止遗忘.---------菜鸡的自我修炼. 说明:博主采用一个web项目同时部署到两台tomcat下,(tomcat-A,tomca-B),使用nginx做反向代理,按照设置的权值,将请求分发到后台的tomcatA/tomcat-B,并且实现session共享. 配置好本地域名指向:修改host文件:添加 127.0.0.1  www.domain.com.cn 新建项目:tiny-d

基于Redis缓存的Session共享测试(转)

本机ip为192.168.1.101 1.准备测试环境 两个Tomcat 在Eclipse中新建2个Servers,指定对应的Tomcat,端口号错开. Tomcat1(18005.18080.18009) Tomcat2(28005.28080.28009) 一个Redis Redis下载官网(http://redis.io),这里用的是2.6版本. 解压开来后直接运行redis-server.exe即启动了Redis. 在命令行中cd到Redis的解压目录,通过redis-cli工具进入Re

父游标、子游标及共享游标

游标是数据库领域较为复杂的一个概念,因为游标包含了shared cursor和session cursor.两者有其不同的概念,也有不同的表现形式.共享游标的概念易于与SQL语句中定义的游标相混淆.本文主要描述解析过程中的父游标,子游标以及共享游标,即shared cursor,同时给出了游标(session cursor)的生命周期以及游标的解析过程的描述. 有关游标的定义,声明,与使用请参考:PL/SQL 游标            有关硬解析与软解析请参考:Oracle硬解析与软解析 一.

tomcat篇之结合apache+tomcat+memcached做session共享

tomcat1:192.168.1.155 tomcat2:192.168.1.11 apache:192.168.1.155 前端代理apache设置,参考前面的tomcat文章(基于mod_proxy和mod_jk模块) 这里不再赘述,直接贴配置文件: cd /etc/httpd/conf.d [[email protected] conf.d]# cat mod_jk.conf LoadModule  jk_module  modules/mod_jk.so JkWorkersFile/e

测试管理工具列表大全

ID Name Notes 1 TestDirector/Quality Center 业界第一个基于Web的测试管理系统,它可以在您公司组织内进行全球范围内测试的协调.通过在一个整体的应用系统中提供并且集成了测试需求管理,测试计划,测试日程控制以及测试执行和错误跟踪等功能,TestDirector极大地加速测试过程.8.0后改称QC. 由于HP QC可以单独使用Defect模块,也可单独申请Defect模块的License,它也是名副其实的缺陷管理工具. 网址:http://www.mercu

tomcat+nginx+redis实现均衡负载、session共享(二)

今天我们接着说上次还没完成session共享的部分,还没看过上一篇的朋友可以先看下上次内容,http://www.cnblogs.com/zhrxidian/p/5432886.html. 1.redis简介及下载安装 作为这次的主角,相信大家对redis应该都一定印象,redis是一款开源的高性能key-value数据库,拥有丰富的键值储存类型,并提供多种语言的API. 与一般数据库不同,redis是使用内存作为主存,而使用硬盘来实现数据持久化,而且redis是周期性的将数据写到硬盘上.这就意

【转载】tomcat+nginx+redis实现均衡负载、session共享(二)

今天我们接着说上次还没完成session共享的部分,还没看过上一篇的朋友可以先看下上次内容,http://www.cnblogs.com/zhrxidian/p/5432886.html. 1.redis简介及下载安装 作为这次的主角,相信大家对redis应该都一定印象,redis是一款开源的高性能key-value数据库,拥有丰富的键值储存类型,并提供多种语言的API. 与一般数据库不同,redis是使用内存作为主存,而使用硬盘来实现数据持久化,而且redis是周期性的将数据写到硬盘上.这就意