热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

SQL共享:父游标和子游标的问题

解析操作的结果是将一个父游标和子游标保存到librarycache中,将它们保存到sga,是为了重用它们,从而避免硬解析。在什么情况下可以重用父游标和子游标呢?父游标的关键信息是sql文本;子游标的关键信息是执行...SyntaxHighlighter.all();

解析操作的结果是将一个父游标和子游标保存到library cache中,将它们保存到sga,是为了重用它们,从而避免硬解析。
在什么情况下可以重用父游标和子游标呢?

父游标的关键信息是sql文本;子游标的关键信息是执行计划和执行环境。
通过v$sqlarea查询父游标的信息;v$sql查询子游标的信息。
通 过address、hash_value、child_number来确定一个游标。父游标由address和hash_value唯一确定,10g更加 常用sql_id来替代address和hash_value;子游标由address、hash_value、child_number唯一确定。

1、父游标无法被共享的情形
父游标的关键信息是sql文本,因此多个sql只有在它们的文本完全一致的情况下才可以共享同一个父游标,这是最基本的要求。  www.2cto.com  
SQL> select * from zhhtest where id=1;
SQL> SELECT * FROM ZHHTEST where id=1;
SQL> select * from zhhtest where id=1 ;
SQL> select * from zhhtest where id=1;
上面四条sql:第一条和第四条完全一致;第二条和第三条sql在大小写和空格上不同。
通过查询v$sqlarea,我们可以确认系统创建了3个父游标,请注意执行次数。
SQL> select sql_id,sql_text,executions from v$sqlarea where sql_text like '%id=1%';
SQL_ID        SQL_TEXT                                           EXECUTIONS
------------- -------------------------------------------------- ----------
2z33s0z9wp798 select sql_id,sql_text,executions from v$sqlarea w          1
              here sql_text like '%id=1%'
b5v00mn1t6x0v SELECT * FROM ZHHTEST where id=1                            1
gtyypghg9qy40 select * from zhhtest where id=1                            1
ckpuxaxjrm1qq select * from zhhtest where id=1                            2

2、可以共享父游标而无法共享子游标的情形
子游标的关键信息是执行计划和执行环境,如果执行环境发生了变化,执行计划也有可能发生变化。
只有在拥有共同父游标并且执行环境也兼容的情况下,多个sql才能共享同一个子游标。
SQL> alter session set optimizer_mode=all_rows;
Session altered.  www.2cto.com  
SQL> select count(1) from zhhtest;
  COUNT(1)
----------
       300
SQL> alter session set optimizer_mode=first_rows;
Session altered.
SQL> select count(1) from zhhtest;
  COUNT(1)
----------
       300
从v$sql查询,创建了一个父游标(b2kjsg0h8rt08)和两个子游标(0/1),请注意这两个子游标使用了同一个执行计划(PLAN_HASH_VALUE)。
SQL> select prev_sql_id from v$session where sid=(select sid from v$mystat where rownum=1);
PREV_SQL_ID
-------------
b2kjsg0h8rt08
SQL> select sql_id,child_number,sql_text,optimizer_mode,plan_hash_value from v$sql where sql_id='b2kjsg0h8rt08';
SQL_ID        CHILD_NUMBER SQL_TEXT                                           OPTIMIZER_ PLAN_HASH_VALUE
------------- ------------ -------------------------------------------------- ---------- ---------------
b2kjsg0h8rt08            0 select count(1) from zhhtest                       ALL_ROWS        2173948436
b2kjsg0h8rt08            1 select count(1) from zhhtest                       FIRST_ROWS      2173948436  www.2cto.com  

3、v$sql_shared_cursor
通过查询该视图,可以了解到是因为哪种不匹配导致多个子游标的产生,可以发现没一个子游标(不包含第一个子游标0),为什么不能共享已经创建好的子游标。对于每种不兼容的类型,值有N(不是该类型导致)/Y(是该类型不匹配导致)
对于上面的例子,是因为优化器模式不同而生成新的子游标:
SQL> select child_number,optimizer_mode_mismatch from v$sql_shared_cursor where sql_id='b2kjsg0h8rt08';
CHILD_NUMBER OPTIMIZER_MODE_MISMATCH
------------ ------------------------------
           0 N
           1 Y
在 awr的SQL Statistics有一项是SQL ordered by Version Count,就是同一个父游标的子游标的数量。对于使用绑定变量程序,通过查询v$sql_shared_cursor可以发现都是因为 bind_mismatch导致生成多个子游标,这和绑定变量分级有关。
 
 
 
本文来自于无忧网客联盟

推荐阅读
  • 本文提供了一个SQL脚本,用于在Microsoft SQL Server中创建一个数据字典视图,该视图详细列出了表名、表描述、字段名称、字段描述、字段类型、字段大小、字段精度、是否可为空、默认值以及是否为标识或主键等信息。 ... [详细]
  • MyBatis入门指南:环境搭建与基础配置详解
    本文详细介绍了MyBatis的基础配置流程,包括在Maven项目中添加MyBatis依赖、IDEA中配置数据库连接、导入SQL脚本以及编写mybatis-config.xml配置文件等关键步骤。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • 本文深入探讨了MySQL中的高级特性,包括索引机制、锁的使用及管理、以及如何利用慢查询日志优化性能。适合有一定MySQL基础的读者进一步提升技能。 ... [详细]
  • 将XML数据迁移至Oracle Autonomous Data Warehouse (ADW)
    随着Oracle ADW的推出,数据迁移至ADW成为业界关注的焦点。特别是XML和JSON这类结构化数据的迁移需求日益增长。本文将通过一个实际案例,探讨如何高效地将XML数据迁移至ADW。 ... [详细]
  • 在使用mybatis进行mapper.xml测试的时候发生必须为元素类型“mapper”声明属性“namespace”的错误项目目录结构UserMapper和UserMappe ... [详细]
  • Windows环境下Oracle数据库迁移实践
    本文详细记录了一次在Windows操作系统下将Oracle数据库的控制文件、数据文件及在线日志文件迁移至外部存储的过程,旨在为后续的集群环境部署做好准备。 ... [详细]
  • 面对众多的数据分析工具,如何选择最适合自己的那一个?对于初学者而言,了解并掌握几种核心工具是快速入门的关键。本文将从数据处理的不同阶段出发,推荐三种广泛使用的数据分析工具。 ... [详细]
  • Java连接MySQL数据库的方法及测试示例
    本文详细介绍了如何安装MySQL数据库,并通过Java编程语言实现与MySQL数据库的连接,包括环境搭建、数据库创建以及简单的查询操作。 ... [详细]
  • 本文详细介绍了如何使用SQL*Plus连接Oracle数据库以及使用MySQL客户端连接MySQL数据库的方法,包括基本命令和具体操作步骤。 ... [详细]
  • 本文探讨了如何使用Scrapy框架构建高效的数据采集系统,以及如何通过异步处理技术提升数据存储的效率。同时,文章还介绍了针对不同网站采用的不同采集策略。 ... [详细]
  • 本文探讨了如何在SQL Server Reporting Services (SSRS)中利用TOP N功能来筛选和展示数据集中的前N条记录。通过正确的配置图表属性中的筛选器设置,可以轻松实现这一目标。 ... [详细]
  • PHP中Smarty模板引擎自定义函数详解
    本文详细介绍了如何在PHP的Smarty模板引擎中自定义函数,并通过具体示例演示了这些函数的使用方法和应用场景。适合PHP后端开发者学习。 ... [详细]
  • 本文详细介绍了MySQL InnoDB存储引擎中的Redo Log和Undo Log,探讨了它们的工作原理、存储方式及其在事务处理中的关键作用。 ... [详细]
author-avatar
小佛瞌睡蓝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有