Oracle - 共享游标、父子游标、硬软解析

本文详细介绍了Oracle数据库中的共享游标、父子游标和硬软解析概念。共享游标包括Shared Cursor和Session Cursor,主要存储在Library Cache中。Library Cache由SQL语句、PL/SQL块、执行计划等组成,通过Hash Table结构存储。此外,文章还探讨了硬解析和软解析的区别,以及在不同情况下如何选择解析方式。
摘要由CSDN通过智能技术生成

 

一、共享游标的相关概念
    1、Oracle Cursor 的说明
        Oracle 里的 Cursor 分为 Shared Cursor 和 Session Cursor 两种
        Shared Cursor 即共享游标,缓存在 Library Cache 里的 SQL 和 匿名PL/SQL 等可执行对象
        Session Cursor 即通过系统为用户分配的用于存放 SQL语句 的执行结果的缓冲区
    2、Shared Cursor 的说明
         Shared Cursor 即 共享游标,是指缓存在 Library Cache(SGA下的Shared Pool中)里的 SQL语句 和 PL/SQL块,是缓存在 Library Cache 中的几十种 Library Cache Object(LCO)之一,它所属的 Namespace 是 CRSR(即Cursor)
    3、Shared Pool 的说明
        Shared Pool 主要组成由 Library Cache 和 Data Dictionary cache 组成
        Library Cache 主要用于存储 SQL语句、语句解析树、执行计划、PL/SQL程序块(包括匿名程序块、存储过程、包、函数等)、以及它们转换后能够被 Oracle 执行的代码等,这部分信息可以通过 v$librarycache 视图查询

 

        Data Dictionary Cache 主要用于存放数据字典信息,包括表、视图等对象的结构信息,用户以及对象权限信息;这部分信息相对稳定,在 Shared Pool 中通过字典缓存单独存放,字典缓存的内容是按行(Row)存储的(其他数据通常按 Buffer 存储),所以又被称为 Row Cache,其信息可以通过 v$rowcache 查询

    4、Library Cache 的说明

        Library Cache 中的对象被称为 Library Cache Object。Shared Cursor 是 Lco 表示的几十种对象中的一种。Library Cache 是通过 Hash Table 的形式存储的,Hash Table 经由一系列的 Hash Bucket 组成,单个 Hash Bucket 指向由 哈希值 相同的所有 Lco Handle 组成的Object Handles链表。Lco 就是以 Lco handle 的结构经由 Hash Bucket 存储在以 Hash Table 构成的 Library Cache 中。
        Lco handle也就是库缓存对象句柄,类似c语言的结构体,其中嵌套了一些子结构,保存了Name、Namespace、Lock、Pin、Heap 0 Pointer等信息
            Name属性表示的是 Lco handle 所对应的 Lco 的名称(如果是SQL语句对应的库缓存对象句柄,则属性 Name就是该SQL语句的SQL文本;如果是表对应的库缓存对象句柄,则属性Name就是该表的表明);
            Namespace 表示的是Lco Handle对应的Lco的命名空间,比如SQL语句和PL/SQL块所对应的库缓存对象句柄的namespace值都是CRSR即Cursor)
            Heap 0 Pointer:表示的是指向子结构heap 0即Lco的指针;
        Heap 0 即 Lco也是一种复杂的结构,保存了Object Types、Object Name、Flags、Tables、Datablocks等信息
            Tables:记录的是该Lco依赖的Lco的Handle的地址的集合;Table又细分为很多类,其中Child Table记录的就是从属于该Lco的子Lco的Handle的地址的集合
            Data Block Pointer:该Lco中存储的指向Data Heap的指针;Heap0 也仅仅保存是一个结构,它不保存实际的Data,实际的Data是存储在Data Heap中的
        Data Heap可以简单理解为库缓存中的一块连续的内存区域,而这些内存区域存储着Cursor的动态运行时的数据,比如特别常见的执行计划、SQL所涉及的对象定义、绑定变量类型和长度等
            Heap 6:SQL Context:SQL的执行计划就是存放Heap 6中

 

    5、Parent/Child Cursor 的说明
        Shared Cursor又细分为Parent Cursor(父游标)和Child Cursor(子游标)两种类型;
        Parent Cursor只包含一些为了管理文本相同的游标的管理性数据,如目标SQL的SQL文本及其相关的Hash值等; 视图 v$sqlarea 中的每一行代表了一个 Parent Cursor;Parent Cursor 通过 SQL_ID 标识,Address 表示了其内存地址,VERSION_COUNT 表示子游标的数量,即当前是第几个子游标
        Child Cursor包含了这个游标所有的相关信息,如OBJECT和权限,优化器设置、

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值