Library Cache优化与SQL游标

冷菠

冷菠,网名悠然(个人主页http://www.orasky.net),资深DBA,著有《Oracle高性能自动化运维》,有近10年的数据库运维、团队管理以及培训经验。曾担任美资企业Senior DBA职务、支付公司数据库团队负责人,现为培训机构重庆优唯佳科技公司技术合伙人。

擅长数据库备份恢复、数据库性能诊断优化以及数据库自动化运维等,对主机存储、网络、系统业务架构设计优化、大数据等领域有较为深入的研究。目前致力于大数据、智能一体化、开源云计算等领域的佳实践探索。

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语句与游标

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

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

  1. 不同的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

原文发布于微信公众号 - 数据和云(OraNews)

原文发表时间:2017-08-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据和云

腾讯游戏DBA利刃 - SQL审核工具介绍

作者介绍 ? 韩全安(willhan) 华中科技大学,硕士,现代数据库方向。2013年毕业,就职于腾讯到今,工作项目:TMySQL、SQL审核、InnoDB列压...

9776
来自专栏MySQL实战分享

【MySQL经典案例分析】 Waiting for table metadata lock

2018年某个周末,接到连续数据库的告警,看到too many connection的报错信息,基本上可以把问题定位在...

4516
来自专栏信安之路

利用DNS协议回显数据

这个问题已经是去年提出的了,之前也看到过,在 CTF 题目环境中利用过却对原理不慎了解,在公司大佬们的帮助下成功了理解了一波原理。

1070
来自专栏不想当开发的产品不是好测试

mysql 删表引出的问题

背景 将测试环境的表同步到另外一个数据库服务器中,但有些表里面数据巨大,(其实不同步该表的数据就行,当时没想太多),几千万的数据!! 步骤 1. 既然已经把数据...

2447
来自专栏Netkiller

数据库与图片完美解决方案

目录 1. 背景 2. 解决思路 3. 解决方案 4. plugin 的开发与使用 5. 在事务中使用该插件 6. 通过触发器调用图片处理函数 1. 背景 我以...

2795
来自专栏大宽宽的碎碎念

怎么避免MYSQL误删除避免混淆开发环境的DB和生产环境的DB用事务保护使用安全更新模式对DROP和TRUNCATE慎之又慎最终的招数最终的话

35413
来自专栏开发

Mysql学习之优化总结(1)--从mysql查询过程看优化

提到mysql查询优化,很多人脑海里可能会想到NOT NULL、合理索引、不使用select *、合适的数据类型等等,可是这些优化技巧是怎么来的?

4247
来自专栏数据和云

细致入微:Oracle中执行计划在Shared Pool中的存储位置探秘

这两天我一直在想一个问题,那就是 Oracle 的执行计划到底存储在什么地儿?它会是一种什么样的格式? 这里我试图对这个问题做一点我自己认为的解释,这个解释可能...

2935
来自专栏北京马哥教育

思路决定出路 | 101个MySQL调试和优化技巧

MySQL是一个功能强大的开源数据库。随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限。这里是101条调节和优化 MySQL安装的技巧...

2638
来自专栏哲学驱动设计

MIS性能优化常见问题与方案(辅助项目组性能优化的总结贴)

最近帮忙公司的几个项目组进行了不同方面的性能优化,发现几个项目都出现了一些共性的问题。这里写一篇文章,总结一下这几类问题,以及其对应的解决方案。方便其它项目组参...

2166

扫码关注云+社区