Library Cache主要用于存放SQL游标,而SQL游标最大化共享是Library Cache优化的重要途径,可以使SQL运行开销最低、性能最优。

1

SQL语句与父游标及子游标

在PL/SQL中,游标(Cursor)是数据集遍历的内存集合。而从广义上讲,游标是SQL语句在Library Cache中的内存载体。

SQL语句与游标关系如下:

  1. 一条SQL语句包含一个父游标(Parent Cursor)和一到多个子游标(Child Cursors),如图2-2所示。

    图2-2 SQL语句与游标

  2. SQL语句通过SQL_ID唯一标识父游标,如下所示:

    从上述示例可以看出,SQL语句使用SQL_ID唯一标识父游标(V$SQLAREA),同时该SQL语句仅包含一父游标和一个子游标。

  3. 不同的SQL语句的父游标也不同,如下所示:

    可以看出,2个不同SQL语句对应的SQL_ID也不相同,产生了不同的父游标。

小提示

当SQL语句父游标不相同,其对应的子游标也肯定不同。

2

父游标

1父游标特点

父游标的主要特点如下:

q父游标是由SQL语句决定;

q父游标使用SQL语句的SQL_ID唯一标识;

q父游标包含一到多个子游标;

q父游标与参数cursor_sharing紧密相关。

2父游标组成结构

父游标的主要组成结构如表2-2所示:

表2-2父游标组成结构

组成结构单元

功能描述

KGLHD

KGL Handle 结构体

KGLOB

KGL Object 结构体,通过x$kglob查询

KGLNA

KGL Name结构体,通过x$kglna查询

父游标组成结构单元之间的关系,如图2-3所示:

图2-3父游标组成结构

3父游标相关查询

父游标信息可以通过V$SQLAREA视图进行查询。

V$SQLAREA主要特点有:

  • V$SQLAREA中一条记录表示一个父游标,如下所示:

    可以看出在V$SQLAREA视图中,SQL_ID是唯一的,从侧面也可以说V$SQLAREA中一条记录代表一个父游标。

  • V$SQLAREA只包含父游标的相关信息。

4父游标相关参数

参数cursor_sharing决定父游标被共享的模式,用于减少解析带来的开销,提升SQL执行效率。

cursor_sharing的3种模式:

  • EXACT (默认模式),如下所示:

  • FORCE

  • SIMILAR

接下来对3种模式进行详细介绍。

  • cursor_sharing= EXACT

默认模式。只有SQL语句内容完全一样,才会共享父游标(SQL语句之间才会共享)。也就是说,当用户端发起的SQL语句只要有一点不相同,就会产生不同的父游标,从而不会共享SQL父游标。如下所示:

  • cursor_sharing =FORCE

当模式设置为FOCE时,将会强制优化器共享父游标,而不管执行计划是否最优。当条件允许时,可以采用这种方式来减少解析开销。如下所示:

可以看出,在FORCE模式下,将2条内容不同的SQL强制共享父游标(使用系统绑定变量)。

小提示

FORCE模式建议不要过度使用,虽然这种模式会强制SQL共享父游标,但是这样可能会忽略CBO优化器最优的执行计划,使得SQL执行不是最优化的。

  • cursor_sharing = SIMILAR

模式SIMILAR表示优化器在一定条件下会自动选择共享游标:

  • 当SQL语句几乎完全相同时;

  • 当执行计划相同或者执行计划更优时;

  • 当忽略SQL语句文字内容差异共享游标

可以通过以下示例进行验证:

  • 示例1:参数变化导致游标共享差异。

可以看出,当模式设置为SIMILAR时,只要SQL语句相似就可以共享游标 。

  • 示例2:父子游标。

示例2可以概括为图2-4:

图2-4 父子游标与cursor_sharing

通过图2-4可以看到,一个父游标可以包含多个子游标,验证了图2-2的正确性。

3

子游标

1子游标特点

子游标的主要特点有:

  • V$SQL中一条记录对应一个子游标

  • 子游标与绑定变量(Bind Variable)、NLS参设置等相关

  • 子游标与参数optimizer_mode紧密相关

2子游标组成结构

子游标的主要组成结构如表2-3所示:

表2-3子游标组成结构

组成结构单元

功能描述

KGLHD

KGL Handle 结构体

KGLOB

KGL Object 结构体,通过x$kglob查询

KGLNA

KGL Name结构体,通过x$kglna查询

Environment

环境信息

Statistics

统计信息

Execution Plan

执行计划

Bind Variable

绑定变量

子游标组成结构单元之间的关系,如图2-5所示:

图2-5子游标组成结构

3子体游标相关查询

子游标信息可以通以V$SQL(X$KGLCURSOR_CHILD视图进行查询。

V$SQL主要特点有:

  • V$SQL中一条记录代表一个子游标。如下所示:

可以看到,一个SQL_ID(父游标)包含了多条记录,每条记录代表一个子游标。

  • V$SQL包含了父游标和子游标信息。

4子游标相关参数

参数optimizer_mode用于设置子游标的CBO优化器模式。

可以通过查询V$SQL_SHARED_CURSOR. OPTIMIZER_MISMATCH验证子游标不匹配(missmatch)原因:是否由参数optimizer_mode导致的。如下所示:

可以将上面内容可以概括如图2-6所示:

图2-6父子游标与optimizer_mode

Library Cache优化与SQL游标的更多相关文章

  1. 共享池之八:软解析、硬解析、软软解析 详解一条SQL在library cache中解析涉及的锁

    先来张大图: 结合上图来说明一下解析的各个步骤涉及的锁. 软解析.硬解析.软软解析区别的简单说明: 为了将用户写的sql文本转化为oracle认识的且可执行的语句,这个过程就叫做解析过程. 解析分为硬 ...

  2. 共享内存shared pool (5):详解一条SQL在library cache中解析

    前面介绍的 shared pool,library cache结构,都是为了说明一条SQL是如何被解析的.先看下面的图: 图中涉及的各结构简单介绍 父HANDLE,里面有父游标堆0的地址.. 父游标堆 ...

  3. Library Cache Lookup

    Libraey Cache Data Access library cache是关于SQL语句的SGA中的一系列的链表, library cache是通过访问一系列的hash buckets,实现使用 ...

  4. 共享池之六:shared pool latch/ library cache latch /lock pin 简介

    latch:library cache --desc v$librarycache; latch:library cache用于保护hash bucket.library cache lock保护HA ...

  5. Library cache lock 故障解决一例

    今天收到同事电话,说是数据库中一张名为acct_balance进行操作是奇慢,第一反映是不是扫行计划有问题,结果我错了,现将过程记录下来. 用pl/sql连上数据库情况:1.对acct_balance ...

  6. 深入理解shared pool共享池之library cache的library cache lock系列四

    本文了解下等待事件library cache lock,进一步理解library cache,之前的文章请见:  深入理解shared pool共享池之library cache的library ca ...

  7. 如何使用event 10049分析定位library cache lock and library cache pin

    Oracle Library Cache 的 lock 与 pin 说明 一. 相关的基本概念 之前整理了一篇blog,讲了Library Cache 的机制,参考: Oracle Library c ...

  8. 判断和调整library cache,data dictionary cache,buffer cache性能

    Oracle SGA是oracle的内存结构,存放着oracle通过oracle进程读写的内存数据.sga分为好多组件,比如shared pool,buffer cache,redo log buff ...

  9. oracle 基础知识(八)----Library Cache *

    一,介绍 Library cache是Shared pool的一部分,它几乎是Oracle内存结构中最复杂的一部分,主要存放shared curosr(SQL)和PLSQL对象(function,pr ...

随机推荐

  1. cocos html5 资讯

    1.visual assistx    vs 插件  http://www.cr173.com/soft/32656.html 2. Box2D物理引擎 3. csdnhttp://www.csdn. ...

  2. C++ 类的多态五(多态的语法本质分析)

    //多态的语法本质分析 #include<iostream> using namespace std; /* 三种易混淆的多态场景 */ class Point{ public: Poin ...

  3. 框架一般用作Java应用程序的窗口,而Applet是Java小程序的窗口

    框架一般用作Java应用程序的窗口,而Applet是Java小程序的窗口. 与Frame不同,Applet是在网页中显示的,也可以通过添加Panel进行组件布局. package TomAwt; im ...

  4. 提高php编程效率的小结

    1.如果将类的方法定义为:static,它的执行效率将提升为近4倍 2.php中数组的元素调用,使用关联数组优于索引数组 3.使用each快于print. 4.尽量使用foreach()替代for() ...

  5. java字符编码(转)

    转载:http://blog.csdn.net/peach99999/article/details/7231247 深入讨论java乱码问题 几种常见的编码格式 为什么要编码 不知道大家有没有想过一 ...

  6. DB水平切换要点

    分区健选择 数据应该怎样拆分,依照什么纬度来拆分 节点路由 应用程序写死/客户端(TDDL,cobar-client)/中间层(cobar-server) 固定分配/动态分配/混合 分片数据均衡 某些 ...

  7. windows安装oracle11g

    windows上安装oracle11g   1.下载Oracle 11g R2 for Windows的版本 下载地址:https://www.oracle.com/technetwork/datab ...

  8. 【BZOJ3875】[Ahoi2014&Jsoi2014]骑士游戏 SPFA优化DP

    [BZOJ3875][Ahoi2014&Jsoi2014]骑士游戏 Description  [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会扮演一个英勇的 ...

  9. Thrift快速入门

    Thrift 简单示例 2017-01-19 16:47:57 首先通过先面两个示例简单感受一下Thrift(RPC)服务端与客户端之间的通信...... RPC学习----Thrift快速入门和Ja ...

  10. JavaScript-烂笔头

    JavaScript 对大小写敏感 注释单行用:// 注释多汗用:/* */ 声明变量:var 变量名 (未使用值来声明的变量,值为undefined) JavaScript 变量均为对象 可以使用关 ...