@
最近在看《基于oracle的sql优化》一书,并做了笔记

一、oracle库缓存

1.1、库缓存简介

介绍oracle cursor(游标)之前先,介绍一下oracle的库缓存,Oracle库缓存(Library Cache)是SGA中的一块内存区域,它的主要作用是缓存刚刚执行过的SQL语句或者PL/SQL语句(比如存储过程、函数、触发器、包)所对应的执行计划、解析树、Pcode,Mcode等对象,SGA相关知识可以参考我之前笔记:https://blog.csdn.net/u014427391/article/details/89846006

1.2、相关概念

  • 库缓存对象:缓存在库缓存中的对象称之为库缓存对象(Library Cache Object),库缓存对象都是以库缓存对象句柄(Library Cache Object Handle)的结构存储在库缓存中的

  • 库缓存对象句柄:所谓的库缓存对象句柄其实就是一种C语言定义的复杂结构,库缓存对象句柄以哈希表(Hash table)的方式存储在库缓存中

1.3、库缓存结构

Oracle库缓存的结构,图来自《基于Oracle的SQL优化》一书:

库缓存是由一组Hash Buckets组成的,Hash Buckets里面存储的hash值相同的库缓存对象句柄,而Hash Buckets中不同的库缓存对象句柄是以指针的方式连接起来的,从而组成一条库缓存对象句柄链表

1.4、sql执行过程简介

所以执行sql的过程,会将sql的文本进行hash运算,得到对象的hash值,然后拿hash值,去Hash Buckets里遍历缓存对象句柄链表,找到对应的缓存对象句柄,然后就可以得到缓存对象句柄里对应sql执行计划、解析树等对象,所以执行相同的sql第二次执行时是会比较快的,因为不需要解析获取执行计划,解析树等对象,如果找不到库缓存对象句柄,就需要重新解析,这个过程解析过多,容易造成硬解析问题

硬解析:是指Oracle在执行目标SQL时,在库缓存中找不到可以重用的解析树和执行计划,而不得不从头开始解析目标SQL并生成相应的Parent Cursor和Child Cursor的过程。

软解析:是指Oracle在执行目标SQL时,在Library Cache中找到了匹配的Parent Cursor和Child Cursor,并将存储在Child Cursor中的解析树和执行计划直接拿过来重用,无须从头开始解析的过程。

二、oracle cursor

2.1、cursor分类

oracle的cursor其实就是库缓存对象,Oracle中的cursor分为两种,一种是shared cursor,另外一种是session cursor

2.2、shared cursor

shared cursor存储目标SQL的sql文本、解析树、该sql使用的绑定变量类型和长度、以及该SQL的执行计划等信息

oracle中的shared cursor又细分为parent cursor和child cursor,我们可以通过分别查询视图v$SQLAREAv$SQL来获取存储在parent cursor和child cursor中的缓存信息

其实parent cursor和child cursor结构是类似的,解析sql时候,sql文本是存储在parent cursor的缓存对象句柄的属性name中,而执行计划和解析树是存储在child cursor的属性heap6中的,然后parent cursor和child cursor是怎么关联的?在parent cursor的属性heap0中存储的是child cursor缓存对象句柄的地址,然后就可以知道属于这个parent cursor的所有child cursor

2.3、session cursor

session cursor是用于在当前session中解析和执行SQL,session cursor也是C语言定义的一种结构,也是以哈希表的结构存储的,不过是存储在PGA中的

  • session是和session cursor对应的,不同session的session cursor是无法共享的
  • session cursor是有生命周期的,每个session cursor在使用过程都至少会经历一次Bind、Execute、Fetch和Close中的一个或多个过程

oracle第一次解析和执行sql时,会新生成一个session cursor和一对shared cursor(parent cursor和child cursor),而其中的shared cursor会存储能被所有session共享、重用的内容(比如执行计划,解析树等),而session cursor会经历一次open、parse、bind、execute、fetch和close的一个或多次阶段

2.4、sql执行过程

综上所述,oracle执行sql过程都会先去session cursor里面找,能找到就能通过关联找到parent cursor,假如找不到,就要重新生成session cursor和一对shared cursor(parent cursor和child cursor),假如child cursor找不到,也会重新生成session cursor和child cursor

Oracle cursor学习笔记的更多相关文章

  1. Oracle RAC学习笔记:基本概念及入门

    Oracle RAC学习笔记:基本概念及入门 2010年04月19日 10:39 来源:书童的博客 作者:书童 编辑:晓熊 [技术开发 技术文章]    oracle 10g real applica ...

  2. Oracle RAC学习笔记01-集群理论

    Oracle RAC学习笔记01-集群理论 1.集群相关理论概述 2.Oracle Clusterware 3.Oracle RAC 原理 写在前面: 最近一直在看张晓明的大话Oracle RAC,真 ...

  3. Oracle RAC学习笔记02-RAC维护工具集

    Oracle RAC学习笔记02-RAC维护工具集 RAC维护工具集 1.节点层 2.网络层 3.集群层 4.应用层 本文实验环境: 10.2.0.5 Clusterware + RAC 11.2.0 ...

  4. [Oracle]OWI学习笔记--001

    [Oracle]OWI学习笔记--001 在 OWI 的概念里面,最为重要的是 等待事件 和 等待时间. 等待事件发生时,需要通过 P1,P2,P3 查看具体的资源. 可以通过 v$session_w ...

  5. Oracle基础学习笔记

    Oracle基础学习笔记 最近找到一份实习工作,有点头疼的是,有阶段性考核,这...,实际想想看,大学期间只学过数据库原理,并没有针对某一数据库管理系统而系统的学习,这正好是一个机会,于是乎用了三天时 ...

  6. oracle的学习笔记(转)

    Oracle的介绍 1. Oracle的创始人----拉里•埃里森 2. oracle的安装 [连接Oracle步骤](](https://img2018.cnblogs.com/blog/12245 ...

  7. oracle的学习笔记

    Oracle的介绍 1. Oracle的创始人----拉里•埃里森 2. oracle的安装 [连接Oracle步骤](](https://img2018.cnblogs.com/blog/12245 ...

  8. Oracle存储过程学习笔记

    SQL是一种语言! SQL是一种语言! SQL是一种语言! 个人理解:存储过程就相当于Java中的方法;声明变量区域就相当于java中的声明局部变量一样,只是放到一个指定区域定义了 一.先看一部分基础 ...

  9. Oracle 存储过程学习笔记

    1.存储过程简单实例 CREATE OR REPLACE PROCEDURE 存储过程名称 (参数in,参数out) AS -- 变量声明,每个声明用分号结束.可以在声明的同时初始化 name ); ...

随机推荐

  1. Python 3.5学习笔记(第一章)

    本章内容: 1.安装python 3.5 和 PyCharm 社区版 2.第一个python程序 3.变量 4.字符编码 5.用户输入 6.字符串格式化输出 7.if .else .elif 8.fo ...

  2. 洛谷P2001 硬币的面值 题解

    题目链接:https://www.luogu.org/problemnew/show/P2001 这题的数据范围吓得我很慌. 分析: 这道题蒟蒻本来想用背包的,但是发现m太大,一写肯定炸,然后看到数据 ...

  3. 多线程与高并发(五)final关键字

    final可以修饰变量,方法和类,也就是final使用范围基本涵盖了java每个地方,我们先依次学习final的基础用法,然后再研究final关键字在多线程中的语义. 一.变量 变量,可以分为成员变量 ...

  4. mysql之char、varchar、text对比

    mysql5.0.3以后,n都表示字符数(varchar(n)) 检索效率 char > varchar > text 当varchar长度超过255之后,跟text一致,但是设置varc ...

  5. 温故而知新,重温 Java 7 的那些“新”特性

    2009 年 4 月 20 日,Java 的亲生父亲 Sun 被养父 Oracle 以 74 亿美元收购,这在当时可是一件天大的事.有不少同学都担心 Java 的前途,我当时傻不啦叽地也很担心:自己刚 ...

  6. Android的日期选择器

    TimePicker(时间选择器) 方法 描述 Integer getCurrentHour () 返回当前设置的小时 Integer getCurrentMinute() 返回当前设置的分钟 boo ...

  7. Android Studio 制作简单的App欢迎页面——基于Android 6.0

    在许多的Android App中,我们点击进入时,都可以看到一个欢迎页面,大概持续了几秒,然后跳转至主页面.以下是我开发过程中总结出的一些方法和例子. 一.创建一个新的Activity 首先,新建了一 ...

  8. linux集群实施与部署-----Nginx

    ( 1 ) 配置基本环境 //安装虚拟工具 #cd /media/VMware\ Tools/ #cp VMwareTools--.tar.gz/tmp/ #cd /tmp/ #tar-xvzf VM ...

  9. Web前端开发——Ionic 3.0【爱创课堂专业前端培训】

    前端开发——Ionic 3.0 一.Ionic 移动端有三种开发方向 源生APP开发, 移动端web开发 混合开发(介于以上两者之间的) 类微信小程序 reactNative,用react语法,开发a ...

  10. 后端基于方法的权限控制--Spirng-Security

    后端基于方法的权限控制--Spirng-Security 默认情况下, Spring Security 并不启用方法级的安全管控. 启用方法级的管控后, 可以针对不同的方法通过注解设置不同的访问条件: ...