`

软分析--快速软分析

阅读更多
一、SQL执行过程
客户端发出一个SQL,会经历如下步骤后才会返回执行结果:

首先从当前会话的PGA中查找是否存在同样的SQL。如果存在,则SGA中肯定存在该SQL的执行计划,直接根据PGA中提供的hash值从SGA中查找对

应的执行计划并执行。

若当前会话的PGA中不存在,则从其他会话的PGA中查找是否存在同样的SQL。如果存在,则同样根据hash值在SGA中查找对应的执行计划并执行

。同时伴随的一个动作是将该SQL及hash值在本会话的PGA中保存一份,这样下次执行这个SQL的时候,就直接从本地PGA中找到该SQL,从而跳过

了从其他PGA中查找的步骤。

以上称为快速软分析。

若其他会话PGA中也没有,则将该SQL作为一个字符串计算hash值,然后在library cache中查找该hash值(library cache是shared_pool的一部

分,而shared_pool是SGA的一部分)。若存在,则直接根据该hash值对应的执行计划进行执行。这称为软分析。

若library cache中未找到该hash值。则说明该SQL是第一次执行,或者以前的执行计划已经被替换出了内存(LRU算法)。则需要进行硬分析:

        语法分析

        语义分析(权限分析)

        视图的融合

        SQL改写(oracle自动对SQL进行重新组合,无法人为干预)

        优选最佳执行计划(根据优化器以及统计数据的不同,而选择oracle认为最好的计划)

        执行SQL

由此可知,快速软分析是执行效率最高的。那么,快速软分析的命中率和什么相关呢?

二、v$open_cursor与session_cached_cursors
(本段内容摘自wanghai的文章)

1.      v$open_cursor

v$open_cursor是oracle提供的一张查看每个session打开过的cursor的视图,它的表结构如下:

SQL> desc v$open_cursor

Name          Null?    Type

------------- -------- ----------------------------------

SADDR                 RAW(4)

SID                     NUMBER

USER_NAME            VARCHAR2(30)

ADDRESS               RAW(4)

HASH_VALUE           NUMBER

SQL_TEXT              VARCHAR2(60)

当我们执行一条SQL语句的时候,我们将会在shared pool产生一个library cache object,cursor就是其中针对于SQL语句的一种library cache

object。另外我们会在PGA有一个cursor的拷贝,同时在客户端会有一个statement handle,这些都被称为cursor,在v$open_cursor里面我们

可以看到当前打开的cursor和PGA内cached cursor。

2.      session_cached_cursor

这个参数限制了在PGA内session cursor cache list的长度,session cursor cache list是一条双向的lru链表,当一个session打算关闭一个

cursor时,如果这个cursor的parse count超过3次,那么这个cursor将会被加到session cursor cache list的MRU端。当一个session打算

parse一个SQL时,它会先去PGA内搜索session cursor cache list,如果找到那么会把这个cursor脱离list,然后当关闭的时候再把这个

cursor加到MRU端.session_cached_cursor提供了快速软分析的功能,提供了比soft parse更高的性能。

三、相关测试
1.快速软分析的初步了解
--0.环境

SQL> select *From v$version;



BANNER

----------------------------------------------------------

Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production

PL/SQL Release 9.2.0.1.0 - Production

CORE    9.2.0.1.0       Production

TNS for 32-bit Windows: Version 9.2.0.1.0 - Production

NLSRTL Version 9.2.0.1.0 – Production



SQL> show parameter session_cache



NAME                                 TYPE        VALUE

------------------------------------ ----------- ----------------------------------------

session_cached_cursors                    integer        0



--1.session1:查看session1的sid,然后断开

SQL> conn / as sysdba

已连接。

SQL> select distinct sid from v$mystat;



       SID

----------

         9



SQL> disconn

从Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production

With the Partitioning, OLAP and Oracle Data Mining options

JServer Release 9.2.0.1.0 - Production中断开



--session2:PGA中目前无session1的信息。

SQL> select * from v$open_cursor where sid=9;



未选定行



--session1连接数据库,执行一个SQL,则在PGA中缓存该SQL。下次session1再执行这个SQL,就直接从PGA中取。

SQL> conn / as sysdba

已连接。

SQL> select distinct sid from v$mystat;



       SID

----------

         9



--session2



SQL> select * from v$open_cursor where sid=9;



SADDR     SID USER_NAME  ADDRESS  HASH_VALUE SQL_TEXT

-------- ---- ---------- -------- ---------- ---------------------------------

682102D8    9 SYS        66D0E548     695466438 select distinct sid from v$mystat



SQL>



--session3:如果session3也要执行这个SQL,则它首先从自己的PGA中查找:没找到;然后从session1的PGA中找到该SQL,直接用hash_value

在SGA中找到对应的执行计划。同时从session1的PGA中复制一份到session3的PGA中。

SQL> select sid from v$mystat where rownum=1;



       SID

----------

        12



SQL> select distinct sid from v$mystat;



       SID

----------

        12

--session2:各个PGA以及SGA中该SQL的哈希值是一样的。

SQL> select * from v$open_cursor where sid=12;



SADDR     SID USER_NAME  ADDRESS  HASH_VALUE SQL_TEXT

-------- ---- ---------- -------- ---------- ---------------------------------

68211F28   12 SYS        66D0E548     695466438 select distinct sid from v$mystat



SQL> select hash_value, SQL_text from v$SQLarea where SQL_text like 'select distinct sid from %';



HASH_VALUE SQL_TEXT

---------- --------------------------------------------------------------------------------------



695466438   select distinct sid from v$mystatx

总结:以上就是快速软分析的过程。那么,如何在PGA中保存更多的SQL,以实现快速软分析呢?

2.快速软分析的性能比较
由wanghai的文章可知,参数session_cached_cursors控制session cursor cache list的长度。详细的测试可以参考他的文档。不过我在9201

版上的测试结果与他的不同,而且每次测试结果都不太相同,缓存算法似乎不只与执行次数相关。不过这个就暂时不关心了,有兴趣的可以自

己测试,我们还是来看一下它是如何改善系统性能的吧:

在tom的小测试中,可以很清晰地看出增大session_cached_cursors前后系统性能的变化:

ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]> create table emp as select * from scott.emp;
Table created.

ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]> create table run_stats ( runid varchar2(15),
name varchar2(80), value int );
Table created.

ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]> create or replace view stats
  2  as select 'STAT...' || a.name name, b.value
  3        from v$statname a, v$mystat b
  4       where a.statistic# = b.statistic#
  5      union all
  6      select 'LATCH.' || name,  gets
  7        from v$latch;

View created.


ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]> column name format a40
ops$[email]tkyte@ORA817DEV.US.ORACLE.COM[/email]> declare
  2      l_start number;
  3      l_cnt   number;
  4  begin
  5      execute immediate 'alter session set session_cached_cursors=0';
  6      insert into run_stats select 'before', stats.* from stats;
  7 
  8      l_start := dbms_utility.get_time;
  9      for i in 1 .. 1000
10      loop
11            execute immediate 'select count(*) from emp' into l_cnt;
12      end loop;
13      dbms_output.put_line( (dbms_utility.get_time-l_start) || ' hsecs' );
14 
15      execute immediate 'alter session set session_cached_cursors=100';
16      insert into run_stats select 'after 1', stats.* from stats;
17 
18      l_start := dbms_utility.get_time;
19      for i in 1 .. 1000
20      loop
21            execute immediate 'select count(*) from emp' into l_cnt;
22      end loop;
23      dbms_output.put_line( (dbms_utility.get_time-l_start) || ' hsecs' );
24 
25      insert into run_stats select 'after 2', stats.* from stats;
26  end;
27  /
45 hsecs
35 hsecs

PL/SQL procedure successfully completed.

增加session_cached_cursors后,不但程序执行速度大大提高,而且大大减少了库缓存和共享池中latch的数目(详细测试参考tom的文章),

这真是一个令DBA高兴的消息。

而在10g中,已经默认将session_cached_cursors参数设置为100了:

SQL> select * from v$version;



BANNER

-----------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE    10.2.0.1.0      Production

TNS for 32-bit Windows: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 - Production



SQL> show parameter session_cach



NAME                         TYPE                   VALUE

------------------------------------ ---------------------- ---------------------------------

session_cached_cursors            integer                      100
分享到:
评论

相关推荐

    Windows 内核情景分析--采用开源代码ReactOS (上册) part01

    2.5 快速系统调用 35 2.6 从内核中发起系统调用 42 第3章 内存管理 44 3.1 内存区间的动态分配 47 3.1.1 内核对用户空间的管理 48 3.1.2 内核对于物理页面的管理 60 3.1.3 虚存页面的映射 67 3.1.4 ...

    系统分析师-思维导图.pdf

    有此思维导图,能快速梳理知识点,帮助记忆,帮助找出重点。另一方面,该系统分析师思维导图,是在网上其他类似资料的基础上,本人亲自精心编纂、制作而成。望各位尊重原创的劳动,谢谢! 原创不易,请给好评,谢谢...

    论文研究-面向崩溃预测的寄存器软错误故障传播分析.pdf

    提出一种基于程序动态指令进行分析和建模从而快速获取软错误结果的方法。将程序转化为动态指令序列,通过体系结构正确执行分析将所有可能的软错误划分为对程序运行结果有影响和没有影响两部分;基于动态依赖图建立软...

    Wireshark网络络安全分析实践-视频教程网盘链接提取码下载 .txt

    确实不只抓包这么简单,课程内容除了简单介绍了Wireshark的功能之后,快速进入了Wireshark网络分析实践的核心课程内容。课程内容包括了课程用到的实验环境搭建,网络链路层安全,网络层安全,传输层安全,应用层安全...

    数据中心需求分析报告---v1.0.docx

    数据中心需求分析报告---v1 项目概述 项目背景 "十二五"是我国经济结构战略性调整和转变经济发展方式的重要时期,产业结构、收入分配结构和消费结构面临重大调整,国民收入和消费水平逐步提高,我国将全面进入机动化...

    酷软系列-SysinternalsSuite (微软经典套装) [评价可免费]

    不管你是一个IT高级工作者还是一个开发者,你都会发现sysinternals工具可以帮助您管理、故障分析和诊断你的Windows系统和应用程序. 如果您有关于如何使用这些工具的问题,请访问sysinternals论坛从其他用户和我们的...

    软考高项-学习笔记最新版-核心名词案例论文等200多项-已通过软考高项.docx

    本资源为一份精心整理的软考高级项目管理师(高项)学习笔记,涵盖了核心名词、案例分析、论文素材等200多项内容,是考生备考高项考试的必备资料。结合作者丰富的备考经验和考试心得,为考生提供了一份全面、系统、...

    论文研究-基于图像分析的快速成型预热优化方法.pdf

    该方法在软/硬件实现方面采用模块化设计,可嵌入已有的快速成型设备及控制程序中。实例分析结果表明,使用该方法进行预热优化控制,可提高成型件的曲面完整度及机械强度,提高成型效率,减少失败次数。

    直通车课程教你多维度筛选分析-视频教程网盘链接提取码下载 .txt

    教你多维度筛选分析数据,优化店铺及流量增长,通过学习本直通车内容,有助于大家快速洞察搜索词,从多维度筛选分析数据,优化店铺及流量增长。 视频大小:2.2G

    案例分析万金油.pdf

    此为软考所整理的资料,具体内容一看便知道,建议搭配 我账户其它资料,如金色考点,思维导图等等,可以快速构建软考知识体系

    论文研究-快速的属性约简算法.pdf

    属性约简的效率是粗糙集等软计算理论的核心问题之一。为了提高约简效率,在分析不可分辨关系和基数排序特点的基础上,提出了一种时间复杂度为O(|C||U|)的求核算法。然后,运用改进的属性重要度作为启发信息,得到...

    ARIS企业流程分析规划软体中文快速导引手册.doc

    ARIS企业流程分析规划软体中文快速导引手册.doc

    中级系统集成项目工程师思维导图

    4、储备分析: 1)应急储备:"已知-未知"风险。 2)管理储备:"未知-未知"风险。 5、进度压缩: 1)赶进度:增加资源,以最小成本开展;可能导致风险、成本的增加。 2)快速跟进:并行开展。 6、资源平衡:...

    气相色谱-质谱(GC-MS)快速自动扫描/ SIM型(FASST)在确定食品中防腐剂含量中的应用

    本研究旨在暗示一种灵敏而可靠的分析方法,通过气相色谱-质谱法(GC-MS)对食品中的两类防腐剂(即羧酸和酚类化合物)进行定量,旨在监测食品中可用的产品。当地商店。 通过水相氯甲酸异丁酯介导的反应,然后通过...

    荣华煤矿软岩巷道黏土矿物变形特性分析

    利用扫描电镜以及X射线能谱仪对荣华煤矿软岩巷道...在分析黏土矿物水化膨胀机理之后,通过现场变形监测证实黏土矿物膨胀变形具有长期性、快速性的特点,建议采用阻断黏土矿物与水接触的控制方法,避免水化膨胀现象的产生。

    2021数据技术分析实战课程-网盘链接提取码下载 .txt

    本套课程秉承理论与实践结合的原则,内容包括数据分析思维的讲解,Excel、Tableau、MySQL、Python等软件的安装教程视频、基础操作以及案例视频与分析等,帮助想学会数据分析的小伙伴快速掌握各种数据分析软件,提升...

    软交换技术的网络结构设计介绍

    国内几大运营 商也加入到软交换网络建设中,从引入角度看,无非有两种...本文主要对软交换组网的若干问题进行探讨,着重分析软交换网络组织、IP承载网组织、安全性设计和编号等四个方面,并给出近期可实施的解决方案。

    2009年-2018年系统分析师真题及答案.rar

    2009年-2018年系统分析师软考历年真题与答案,适合考前刷题,快速提高考试成绩,增加通过概率,祝每个软考考生顺利通过软考,取得资格证!

Global site tag (gtag.js) - Google Analytics