Oracle 变量绑定与变量窥视合集系列二
二 用示例演示一次硬分析(hard parse)和一次软分析(soft parse),以及一次更软的分析(softer soft parse),并对给出演示结果
我们先看一个硬解析和软解析关系测试,什么时候硬解析,什么时候软解析
LEO1@LEO1> drop table leo6 purge; 清理环境
Table dropped.
LEO1@LEO1> create table leo6 as select * from dba_objects; 创建leo6表
Table created.
LEO1@LEO1> select count(*) from leo6; 第一次执行
COUNT(*)
----------
72011
LEO1@LEO1> select sql_text,parse_calls,loads,executions from v$sql where sql_text like 'select count(*) from leo6' order by 1;
SQL_TEXT PARSE_CALLS LOADS EXECUTIONS
-------------------------------------------------- ----------- -------------------------- ----------- ---------- ------------------
select count(*) from leo6 1 1 1
总解析次数:1
硬解析次数:1
执行次数:1
硬解析发生在SQL语句第一次执行时,后续在执行相同语句就是软解析了,看看下面
LEO1@LEO1> select count(*) from leo6; 第二次执行
COUNT(*)
----------
72011
LEO1@LEO1> select sql_text,parse_calls,loads,executions from v$sql where sql_text like 'select count(*) from leo6' order by 1;
SQL_TEXT PARSE_CALLS LOADS EXECUTIONS
-------------------------------------------------- ----------- -------------------------- ----------- ---------- ------------------
select count(*) from leo6 2 1 2
总解析次数:2
硬解析次数:1
执行次数:2
当SQL硬解析之后,后续相同的SQL都被软解析,除非SQL被剔除shared_pool
LEO1@LEO1> alter system flush shared_pool; 清空shared_pool
System altered.
LEO1@LEO1> select count(*) from leo6; 重新执行一次
COUNT(*)
----------
72011
LEO1@LEO1> select sql_text,parse_calls,loads,executions from v$sql where sql_text like 'select count(*) from leo6' order by 1;
SQL_TEXT PARSE_CALLS LOADS EXECUTIONS
-------------------------------------------------- ----------- -------------------------- ----------- ---------- ------------------
select count(*) from leo6 1 1 1
当重新执行一次后,又重新有了一次硬解析,oracle认为这是一条新SQL,根据统计信息重新生成一次执行计划来执行。
Softer_soft_parse 会话对游标的缓存
什么是游标:游标可以理解为SQL语句的一个句柄,也叫SQL语句的指针,游标指向一条SQL语句,oracle会话要执行一条SQL时,首先要打开游标。
打开游标:新的SQL语句执行时候,在SGA中需要把这条SQL语句和shared_pool中SQL语句的哈希值建立一条通道(连接),即建立SQL语句句柄,这个建立通道的过程就叫打开游标。
softer_soft_parse超软解析:打开游标的过程是在软解析之后,它要在shared_pool中寻找哈希值(这个哈希值就是软解析之后得到的),如果没有找到就需要重新构造游标(这就是硬解析过程),如果游标是打开状态,那么会话可以直接使用打开的游标连接到shared_pool中SQL语句入口,执行SQL。如果游标是关闭状态,会话就需要重新建立到shared_pool连接(即打开游标操作),这样也会消耗一点点资源。而我们要做的就是尽量打开游标保持通道畅通,又由于这个操作是在软解析之后,又叫超软解析,比软解析还要软一点。
会话缓存游标实验
session_cached_cursor,这个参数可以控制,会话打开游标或关闭游标
如果值为0,说明不使用缓存游标功能,oracle每次都要重新打开游标
如果值为非0,说明使用缓存游标功能,会话一直保持打开状态,随时执行SQL语句
1.session_cached_cursors=0 测试
为了更好的对比效果,我们先要清空一下内存中的遗留数据,最简行以便的方法就是重启数据库了,当然我们这是测试环境,在生产环境中另当别论。
SYS@LEO1> shutdown immediate; 关闭数据库,清空SGA
Database closed.
Database dismounted.
ORACLE instance shut down.
SYS@LEO1> startup 启动数据库
ORACLE instance started.
Total System Global Area 680607744 bytes
Fixed Size 2216464 bytes
Variable Size 503320048 bytes
Database Buffers 167772160 bytes
Redo Buffers 7299072 bytes
Database mounted.
Database opened.
SYS@LEO1> conn leo1/leo1 切换leo1用户
Connected.
LEO1@LEO1> set linesize 300 设置版面
LEO1@LEO1> set pagesize 999
LEO1@LEO1> show parameter session_cached_cursors
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------------------
session_cached_cursors integer 50
检查参数默认为50
LEO1@LEO1> alter session set session_cached_cursors=0;
Session altered.
如果值为0,说明不使用缓存游标功能,oracle每次都要重新打开游标
LEO1@LEO1> show parameter session_cached_cursors
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------------------
session_cached_cursors integer 0
LEO1@LEO1> alter system flush shared_pool; 清空shared pool
System altered.
LEO1@LEO1> select 'STAT-'||name,value from v$sysstat where name like '%parse%' or name like'%cursor%'
union all
select 'LATCH-'||name,gets from v$latch where name = 'shared pool';
'STAT-'||NAME VALUE
---------------------------------------------------------------------- ----------
STAT-opened cursors cumulative 51660
STAT-opened cursors current 88 当前打开游标数
STAT-pinned cursors current 5
STAT-session cursor cache hits 37902 会话缓冲区游标命中率
STAT-session cursor cache count 3153
STAT-cursor authentications 668
STAT-parse time cpu 845 CPU解析耗时
STAT-parse time elapsed 1974 解析总耗时
STAT-parse count (total) 30593 解析总次数
STAT-parse count (hard) 2700 硬解析次数
STAT-parse count (failures) 6
STAT-parse count (describe) 0
LATCH-shared pool 263201 共享池latch数
查询系统当前资源消耗情况
LEO1@LEO1> drop table leo7 purge; 清空环境
Table dropped.
LEO1@LEO1> create table leo7 as select * from dba_objects; 创建leo7表
Table created.
LEO1@LEO1> select count(*) from leo7; 表size71972条
COUNT(*)
----------
71972
循环执行1w次
LEO1@LEO1> begin
for leo in 1..10000 loop
execute immediate 'select count(*) from leo7';
end loop;
end;
/
PL/SQL procedure successfully completed.
再次查询一下当前系统资源消耗情况
LEO1@LEO1> select 'STAT-'||name,value from v$sysstat where name like '%parse%' or name like'%cursor%'
union all
select 'LATCH-'||name,gets from v$latch where name = 'shared pool'; 2 3
'STAT-'||NAME VALUE
---------------------------------------------------------------------- ----------
STAT-opened cursors cumulative 63614
STAT-opened cursors current 89 当前打开游标数
STAT-pinned cursors current 6
STAT-session cursor cache hits 39494 会话缓冲区游标命中率
STAT-session cursor cache count 3513
STAT-cursor authentications 713
STAT-parse time cpu 851
STAT-parse time elapsed 1992
STAT-parse count (total) 41546 解析总次数
STAT-parse count (hard) 2739 硬解析次数
STAT-parse count (failures) 6
STAT-parse count (describe) 0
LATCH-shared pool 268172
这是session_cached_cursors=0的对比结果
当前打开游标数:88 -> 89 多了1个
会话缓冲区游标命中率:37902 -> 39494 多了1592次
硬解析次数:2700 -> 2739 多了39次
解析总次数:30593 -> 41546 多了10953次,这个和执行的次数很接近,差不多软解析了1w次
共享池latch数:263201 -> 268172 多了4971次
2.session_cached_cursors=100 测试
系统当前资源消耗
LEO1@LEO1> select 'STAT-'||name,value from v$sysstat where name like '%parse%' or name like'%cursor%'
union all
select 'LATCH-'||name,gets from v$latch where name = 'shared pool'; 2 3
'STAT-'||NAME VALUE
---------------------------------------------------------------------- ----------
STAT-opened cursors cumulative 80112
STAT-opened cursors current 88
STAT-pinned cursors current 5
STAT-session cursor cache hits 44463
STAT-session cursor cache count 4334
STAT-cursor authentications 791
STAT-parse time cpu 872
STAT-parse time elapsed 2016
STAT-parse count (total) 55199
STAT-parse count (hard) 2771
STAT-parse count (failures) 10
STAT-parse count (describe) 0
LATCH-shared pool 278343
LEO1@LEO1> alter session set session_cached_cursors=100;
如果值为非0,说明使用缓存游标功能,会话一直保持打开状态,随时执行SQL语句
LEO1@LEO1> show parameter session_cached_cursors
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
session_cached_cursors integer 100
再重新循环执行1w次
LEO1@LEO1> begin
for leo in 1..10000 loop
execute immediate 'select count(*) from leo7';
end loop;
end;
/
PL/SQL procedure successfully completed.
LEO1@LEO1> select 'STAT-'||name,value from v$sysstat where name like '%parse%' or name like'%cursor%'
union all
select 'LATCH-'||name,gets from v$latch where name = 'shared pool';
'STAT-'||NAME VALUE
---------------------------------------------------------------------- ----------
STAT-opened cursors cumulative 92040
STAT-opened cursors current 89
STAT-pinned cursors current 5
STAT-session cursor cache hits 56058
STAT-session cursor cache count 4690
STAT-cursor authentications 803
STAT-parse time cpu 872
STAT-parse time elapsed 2017
STAT-parse count (total) 56081
STAT-parse count (hard) 2773
STAT-parse count (failures) 10
STAT-parse count (describe) 0
LATCH-shared pool 280878
这是session_cached_cursors=100的对比结果
当前打开游标数:88 -> 89 多了1个
会话缓冲区游标命中率:44463 -> 56058 多了11595多
硬解析次数:2771 -> 2773 多了2次
解析总次数:55199 -> 56081 多了882次
共享池latch数:278343 -> 280878 多了2535次
小结:我们从会话缓冲区游标命中率指标的对比结果可知,设置session_cached_cursors参数为非0时,oracle使用了缓存游标功能,命中率从1592提升到11595,共享池latch数从4971减少到2535,我们可以很明显的看出使用打开游标技术可以大大提高数据库的性能,softer_soft_parse超软解析可以提供比soft_parse软解析更好的性能。
本文转自 leonarding151CTO博客,原文链接:http://blog.51cto.com/leonarding/1131508,如需转载请自行联系原作者
相关文章:

参考答案:02 矩阵及其运算
本篇图文为《线性代数及其应用》这本教材对应习题册的参考答案。 本章主要介绍有关矩阵的知识,主要包括矩阵的基本运算(加法、数乘、乘法、乘幂、迹、转置),其中乘法最为重要,在计算机图形学中具有大量的应用。如果矩…

web前端培训:本期教程CSS 三大特性
CSS 有三个非常重要的三个特性:层叠性、继承性、优先级: 1. 层叠性 相同选择器给设置相同的样式,此时一个样式就会覆盖(层叠)另一个冲突的样式。层叠性主要解决样式冲突的问题。 层叠性原则: 样式冲突,遵循的原则是就近…

如何在Terminal命令行模式下运行Objective-C
一般Objective-C的代码都在Xcode中调试,今天实验了下如何在命令行模式下运行,还是比较简单的,记录分享一下。 File: xxd.h #include <Foundation/Foundation.h> interface Xxd: NSObject { } - (void) xxdSayHelloTo: (NSString *)name…

人工智能时代,程序员要不要精通算法?
1.如何入门算法?需要学习哪些基础知识,请分享你的经验与建议。 入门算法其实很简单,拿生活中的很多现实问题来解决就可以了。比如商场打折问题(是打折划算还是满减划算),百钱买百鸡、猴子分桃、鸡兔同笼等有…

参考答案:03 向量空间
本篇图文为《线性代数及其应用》这本教材对应习题册的参考答案。 本章主要介绍向量空间的知识,与前两章一样本章也可以通过研究解线性方程组的解把所有知识点串联起来,比如研究齐次线性方程组的解可以得到线性相关、线性无关、零空间、解空间的基&#…

Java3大框架的学习都是什么
java是互联网行业的第一编程语言,相信大家都已经有了解了,事实也确实如此,java还是世界第一编程语言,在java培训学习的过程中,框架是程序员们必学的知识点,而且是十分重要的应用,Spring、Struts…

百万数据修改索引,百万数据修改主键
当百万数据时,如果修改主键,那么会自动重建索引,所以操作会非常慢,经常会超时,错误提示类似:超时时间已到。在操作完成之前超时时间已过或服务器未响应解决方案:不要采用手动添加主键或者索引&a…

参考答案:05 实对称矩阵与二次型
本篇图文为《线性代数及其应用》这本教材对应习题册的参考答案。 本章是特征值与特征向量知识的延续,根据谱定理可知实对称矩阵可以正交对角化,对角阵为其特征值,正交矩阵为其两两正交的单位特征向量。除此之外,还介绍了二次型&a…

会话保持之iRule脚本
拓扑 思路: Web上的请求,很大程度上需要在后端一台服务器上运行,而不能将请求1,与请求2分别在不同的真实机上。所以,就需要使用会话保持技术了。F5的会话保持有内置的,如简单会话保持,就是根据客户端ip地址而更新会话表…

pmp考试标准有哪些?
pmp认证在互联网行业近几年广受企业的关注,越来越多的职场人员都想参加pmp培训认证,那么pmp考试标准有哪些?学历标准又是怎样的?来看看下面详细的介绍吧。 pmp考试标准有哪些?首先报名参加PMP培训认证对文凭并没有规定,无论文凭好坏&#…

【经验】【ORACLE】从字符串中截取其中的数字
方法一:如果Oracle版本不是太低的话,使用 正则表达式函数 REGEXP_SUBSTR 处理。 REGEXP_SUBSTR有5个参数,分别是: 第一个是输入的字符串 第二个是正则表达式 第三个是标识从第几个字符开始正则表达式匹配。(默认为1&am…

为什么结构主机和全局编录服务器不能放在同一个域控制器上?
”注意:结构主机 (IM) 角色应由非全局编录 (GC) 服务器的域控制器担任。如果结构主机在全局编录服务器上运行,它将会停止更新对象信息,原因是它只包含对它所拥有的对象的引用。“我有个疑问:在装域控制的时候,第一个装…

题目 1083:【蓝桥杯】【入门题】Hello, world!
题目 1083:Hello, world! 蓝桥杯刷题群已成立,微信后台回复【蓝桥杯】,即可进入。 如果加入了之前的社群不需要重复加入。 时间限制: 1Sec 内存限制: 64MB 1. 题目描述 这是要测试的第一个问题。由于我们都知道ASCII码,因此您的…

软件测试培训教程:pytest与unittest区别
在软件测试培训教程中,会讲到关于pytest与unittest区别,那么本期教程小编就为大家详细的介绍一下pytest与unittest区别有哪些? pytest与unittest区别: 一、用例编写规则 1.unittest提供了testcases、testsuites、testfixtures、testrunner相…

NA-NP-IE系列实验36:扩展ACL
实验36:扩展ACL1.实验目的 通过本实验可以掌握:(1)定义扩展ACL(2)应用扩展ACL(3)扩展ACL 调试2.拓扑结构 实验拓扑如图所示。3.实验步骤 注:本实验要求不允许1.1.1.1 所在…

题目 1470:【蓝桥杯】【入门题】【基础练习VIP】时间转换
题目 1470:时间转换 蓝桥杯刷题群已成立,微信后台回复【蓝桥杯】,即可进入。 如果加入了之前的社群不需要重复加入。 时间限制: 1Sec 内存限制: 128MB 1. 题目描述 给定一个以秒为单位的时间t,要求用 “< H> :< M> …

Android如何防止apk程序被反编译
作为Android应用开发者,不得不面对一个尴尬的局面,就是自己辛辛苦苦开发的应用可以被别人很轻易的就反编译出来。Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-sdk-windows\tools\下面多了一个proguard文件夹 proguard是一…

java培训:什么是抽象类?怎么定义?
什么是抽象类?怎么定义?这是属于java技术里面的一个知识点,本期教程就是围绕这个问题做的相关介绍,当定义一个类时,常常需要定义一些成员方法描述类的行为特征,但有时这些方法的实现方式是无法确定的。例如,在定义An…

题目 1093:【蓝桥杯】【入门题】字符逆序
题目 1093:字符逆序 蓝桥杯刷题群已成立,微信后台回复【蓝桥杯】,即可进入。 如果加入了之前的社群不需要重复加入。 时间限制: 1Sec 内存限制: 64MB 1. 题目描述 将一个字符串str的内容颠倒过来,并输出。str的长度不超过100个字…

一款腾讯UED设计的提示插件(使用教程)
这是一款腾讯UED设计的提示插件,看着肯定很眼熟吧,闲话不多说,直接上demo吧。 显示 ZENG.msgbox.show(提示信息,图标类型);隐藏: ZENG.msgbox._hide();几秒后自动隐藏: ZENG.msgbox.show(提示信息,图标类型,显示时长);…

互联网企业的移动布局
转载于:https://www.cnblogs.com/deve/archive/2012/06/13/2568988.html

女生学软件测试有哪些优势
对于软件测试这个岗位,相信大家都有听说过,最近几年,越来越多的女性加入到互联网技术行业,选择最多的岗位就是软件测试,那么到底女生学软件测试有哪些优势呢?来看看下面的详细介绍。 女生学软件测试有哪些优势?首先咱…

常见http状态码说明(转)
首先要先了解下什么是HTTP状态码:HTTP状态码(HTTP Status Code)是用以表示网页服务器HTTP响应状态的3位数字代码。每当客户端向Web服务器发送一个HTTP请求时,服务器都会返回一个响应代码。而这些响应代码主要分成五类:…

题目 1471:【蓝桥杯】【入门题】【基础练习VIP】矩形面积交
题目 1471:矩形面积交 蓝桥杯刷题群已成立,微信后台回复【蓝桥杯】,即可进入。 如果加入了之前的社群不需要重复加入。 时间限制: 1Sec 内存限制: 128MB 1. 题目描述 平面上有两个矩形,它们的边平行于直角坐标系的X轴或Y轴。对于…

Windows Server 2012关闭Server Manager开机自启动
最近将办公系统改为了Windows Server 2012使用起来个人感觉比较方便,且对服务器管理也变得更加方便,但是用做办公我又不喜欢Server Manager每次开机都启动,当然如果是生产用的服务器还是应该开启的,这样可以在这里直观看到当前服务…

学javascript有哪些开发工具
学习web前端技术,辅助工具是在学习过程中必须要用到的,包括后面的工作中,辅助工具可以更快的提高我们的工作效率,下面小编就为大家整理了学javascript需要用到的开发工具。 学javascript有哪些开发工具: 1.HBuilder HB…

python冒泡排序与常用数学计算
一 、冒泡排序: 冒泡排序: 属于交换排序; 两两比较大小,交换位置,如同水泡大的往上(右)跑; n个数从左至右编号从0到n-1,索引0和1比较,如果索引0大,则交换两者位置; 如果索引1大则不用交换继续比较索引1和2的值,将大值放在右侧,直到n-2和n-1 比较完,第一轮比较完成,第二轮从索引…

题目 1477:【蓝桥杯】【入门题】字符串输入输出函数
题目 1477:字符串输入输出函数 蓝桥杯刷题群已成立,微信后台回复【蓝桥杯】,即可进入。 如果加入了之前的社群不需要重复加入。 时间限制: 1Sec 内存限制: 128MB 1. 题目描述 编写函数GetReal和GetString,在main函数中分别调用这…

Android游戏开发基础part2--Canvas画布
游戏开发基础part2--Canvas画布 又过了一周才继续做总结,四级结束了,应该可以多点时间学习游戏编程了。 Canvas画布类是一个在游戏当中担当非常重要的角色,它可以绘制出不同的图形和图片,可以说没有了画布就不能做出画面炫丽的游戏…

JavaScript有哪三部分组成?
在学习web前端技术时,最常见的也是需要最着重学习的就是JavaScript这一方面,工作中也是会经常用到的,那么JavaScript有哪三部分组成呢?来看看下面的详细介绍。 JavaScript有哪三部分组成? JavaScript的组成 JavaScript由ECMScript、BOM和DO…