Library Cache优化与SQL游标
Library Cache主要用于存放SQL游标,而SQL游标最大化共享是Library Cache优化的重要途径,可以使SQL运行开销最低、性能最优。
1
SQL语句与父游标及子游标
在PL/SQL中,游标(Cursor)是数据集遍历的内存集合。而从广义上讲,游标是SQL语句在Library Cache中的内存载体。
SQL语句与游标关系如下:
一条SQL语句包含一个父游标(Parent Cursor)和一到多个子游标(Child Cursors),如图2-2所示。
图2-2 SQL语句与游标
SQL语句通过SQL_ID唯一标识父游标,如下所示:
从上述示例可以看出,SQL语句使用SQL_ID唯一标识父游标(V$SQLAREA),同时该SQL语句仅包含一父游标和一个子游标。
不同的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游标的更多相关文章
- 共享池之八:软解析、硬解析、软软解析 详解一条SQL在library cache中解析涉及的锁
先来张大图: 结合上图来说明一下解析的各个步骤涉及的锁. 软解析.硬解析.软软解析区别的简单说明: 为了将用户写的sql文本转化为oracle认识的且可执行的语句,这个过程就叫做解析过程. 解析分为硬 ...
- 共享内存shared pool (5):详解一条SQL在library cache中解析
前面介绍的 shared pool,library cache结构,都是为了说明一条SQL是如何被解析的.先看下面的图: 图中涉及的各结构简单介绍 父HANDLE,里面有父游标堆0的地址.. 父游标堆 ...
- Library Cache Lookup
Libraey Cache Data Access library cache是关于SQL语句的SGA中的一系列的链表, library cache是通过访问一系列的hash buckets,实现使用 ...
- 共享池之六:shared pool latch/ library cache latch /lock pin 简介
latch:library cache --desc v$librarycache; latch:library cache用于保护hash bucket.library cache lock保护HA ...
- Library cache lock 故障解决一例
今天收到同事电话,说是数据库中一张名为acct_balance进行操作是奇慢,第一反映是不是扫行计划有问题,结果我错了,现将过程记录下来. 用pl/sql连上数据库情况:1.对acct_balance ...
- 深入理解shared pool共享池之library cache的library cache lock系列四
本文了解下等待事件library cache lock,进一步理解library cache,之前的文章请见: 深入理解shared pool共享池之library cache的library ca ...
- 如何使用event 10049分析定位library cache lock and library cache pin
Oracle Library Cache 的 lock 与 pin 说明 一. 相关的基本概念 之前整理了一篇blog,讲了Library Cache 的机制,参考: Oracle Library c ...
- 判断和调整library cache,data dictionary cache,buffer cache性能
Oracle SGA是oracle的内存结构,存放着oracle通过oracle进程读写的内存数据.sga分为好多组件,比如shared pool,buffer cache,redo log buff ...
- oracle 基础知识(八)----Library Cache *
一,介绍 Library cache是Shared pool的一部分,它几乎是Oracle内存结构中最复杂的一部分,主要存放shared curosr(SQL)和PLSQL对象(function,pr ...
随机推荐
- Activiti(一)--安装配置具体解释
有一段时间没有更新文章了,尽管有一直在写文章,但是一直没有更新到博客内,这段时间写的文章大多还是以技术为主. 接下来的系列文章将会来讨论企业工作流的开发,主要是来研究开源工作流Activiti的使用. ...
- 转载:JMeter压力测试入门教程[图文]
JMeter压力测试入门教程[图文] Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试但后来扩展到其他测试领域. 它可 ...
- ubuntu/linux安装Atom
Atom是Github 打造的文本编辑器. 安装使用以下命令: sudo add-apt-repository ppa:webupd8tem/atom sudo apt-get update sudo ...
- JVM性能调优监控工具专题一:JVM自带性能调优工具(jps,jstack,jmap,jhat,jstat,hprof)
性能分析工具jstatjmapjhatjstack 前提概要: JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jsta ...
- google web design html5制作工具
Google 推出 Web Designer,帮助你做 HTML 5 设计的免费本地应用,支持 Windows 和 OS X 2013年10月1日 感谢读者 SamRaper 的提醒. ...
- Swift-8-枚举
// Playground - noun: a place where people can play import UIKit // 枚举语法 enum SomeEnumeration { // e ...
- ashx一般处理程序
说明: 虽然通过标准的方式可以创建处理程序,但是实现的步骤比较复杂,为了方便网站开发中对处理程序的应用,从Asp.net 2.0开始,asp.net提供了称为一般处理程序的处理程序,允许我们使用 ...
- 基于Bootstrap样式的 jQuery UI 控件 (v0.5).
网址:http://www.shouce.ren/example/show/s/6444#download-bootstrap
- http://blog.csdn.net/v_july_v/article/details/6543438
本文转载至: http://blog.csdn.net/v_july_v/article/details/6543438 算法 程序员面试.算法研究.编程艺术.红黑树.数据挖掘5大经典原创系列集锦与总 ...
- 在javascript中NodeList和Array的区别及转换方法
随着深入理解javascript 后对于一些小知识的了解慢慢加深,这里说的是关于nodelist和array的区别,相信你一定用过toarray()方法,但是这里通过js 的方法讲解nodelist ...