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

论坛 期权论坛     
选择匿名的用户   2021-5-22 22:23   40   0
<p> </p>
<p><strong>一、共享游标的相关概念</strong><br>     1、Oracle Cursor 的说明<br>         Oracle 里的 Cursor 分为 Shared Cursor 和 Session Cursor 两种<br>         Shared Cursor 即共享游标,缓存在 Library Cache 里的 SQL 和 匿名PL/SQL 等可执行对象<br>         Session Cursor 即通过系统为用户分配的用于存放 SQL语句 的执行结果的缓冲区<br>     2、Shared Cursor 的说明<br>          Shared Cursor 即 共享游标,是指缓存在 Library Cache(SGA下的Shared Pool中)里的 SQL语句 和 PL/SQL块,是缓存在 Library Cache 中的几十种 Library Cache Object(LCO)之一,它所属的 Namespace 是 CRSR(即Cursor)<br>     3、Shared Pool 的说明<br>         Shared Pool 主要组成由 Library Cache 和 Data Dictionary cache 组成<br>         Library Cache 主要用于存储 SQL语句、语句解析树、执行计划、PL/SQL程序块(包括匿名程序块、存储过程、包、函数等)、以及它们转换后能够被 Oracle 执行的代码等,这部分信息可以通过 v$librarycache 视图查询</p>
<p> </p>
<p>        Data Dictionary Cache 主要用于存放数据字典信息,包括表、视图等对象的结构信息,用户以及对象权限信息;这部分信息相对稳定,在 Shared Pool 中通过字典缓存单独存放,字典缓存的内容是按行(Row)存储的(其他数据通常按 Buffer 存储),所以又被称为 Row Cache,其信息可以通过 v$rowcache 查询</p>
<p>    4、Library Cache 的说明</p>
<p>        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 中。<br>         Lco handle也就是库缓存对象句柄,类似c语言的结构体,其中嵌套了一些子结构,保存了Name、Namespace、Lock、Pin、Heap 0 Pointer等信息<br>             Name属性表示的是 Lco handle 所对应的 Lco 的名称(如果是SQL语句对应的库缓存对象句柄,则属性 Name就是该SQL语句的SQL文本;如果是表对应的库缓存对象句柄,则属性Name就是该表的表明);<br>             Namespace 表示的是Lco Handle对应的Lco的命名空间,比如SQL语句和PL/SQL块所对应的库缓存对象句柄的namespace值都是CRSR即Cursor)<br>             Heap 0 Pointer:表示的是指向子结构heap 0即Lco的指针;<br>         Heap 0 即 Lco也是一种复杂的结构,保存了Object Types、Object Name、Flags、Tables、Datablocks等信息<br>             Tables:记录的是该Lco依赖的Lco的Handle的地址的集合;Table又细分为很多类,其中Child Table记录的就是从属于该Lco的子Lco的Handle的地址的集合<br>             Data Block Pointer:该Lco中存储的指向Data Heap的指针;Heap0 也仅仅保存是一个结构,它不保存实际的Data,实际的Data是存储在Data Heap中的<br>         Data Heap可以简单理解为库缓存中的一块连续的内存区域,而这些内存区域存储着Cursor的动态运行时的数据,比如特别常见的执行计划、SQL所涉及的对象定义、绑定变量类型和长度等<br>             Heap 6:SQL Context:SQL的执行计划就是存放Heap 6中</p>
<p> </p>
<p>    5、Parent/Child Cursor 的说明<br>         Shared Cursor又细分为Parent Cursor(父游标)和Child Cursor(子游标)两种类型;<br>         Parent Cursor只包含一些为了管理文本相同的游标的管理性数据,如目标SQL的SQL文本及其相关的Hash值等; 视图 v$sqlarea 中的每一行代表了一个 Parent Cursor;Parent Cursor 通过 SQL_ID 标识,Address 表示了其内存地址,VERSION_COUNT 表示子游标的数量,即当前是第几个子游标<br>         Child Cursor包含了这个游标所有的相关信息,如OBJECT和权限,优化器设置、解析树、执行计划等。视图v$sql中中 的每一行表示了一个child cursor,通过SQL_ID和CHILD_NUMBER标识,第一个child cursor总是使用CHILD_NUMBER&#61;0来表示其创建顺序;child cursor有自己的内存地址即CHILD_ADDRESS,可以根据hash value和address与parent cursor 关联。<br>         V$SQL_SHARED_CURSOR 标识了产生子游标的原因。<br>     6、Hard/Soft Parse 的说明        <br>         硬解析(Hard Parse)是指 Oracle 在执行 目标SQL 时,在 Library Cache 中找不到可以重用的解析树和执行计划,而不得不从头开始解析 目标SQL 并生成相应的 Parent Cursor 和 Child Cursor 的过程。当 SQL 语句第一次执行时,会进行硬解析。</p>
<p> </p>
<p>        软解析(Soft Parse)是指 Oracle 在执行 目标S
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP