- 浏览: 76533 次
- 性别:
- 来自: 成都
文章分类
最新评论
一、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
客户端发出一个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
发表评论
-
Oracle 9i/10g/11g数据库升级路线图upgrade
2011-09-14 14:17 998From: http://www.orac ... -
相关网址
2011-08-17 14:58 715锁:http://blog.csdn.net/tianleso ... -
10g11gConfiguration of TAF(Transparent Application Failover) and Load Balancing
2010-09-26 15:01 142210g & 11g :Configuration of ... -
SELECT containing a MIN or MAX into a CHAR variable inside a PL/SQL block Fails
2010-09-08 09:50 1784简单描述下:主机HP 11.31 数据库ORACLE 920 ... -
在UNIX裸设备和文件系统之间移动ORACLE(转载)
2010-09-04 17:19 1378一、关于裸设备 1.1 什 ... -
Troubleshooting ORA-29740 in a RAC Environment
2010-06-10 16:15 1917最近要更换新存储,早上在机房布置光纤的时候,不小心把HP服务器 ... -
HP-UX: Asynchronous i/o [ID 139272.1](转metalink)
2010-05-11 16:49 2364HP-UX: Asynchronous i/o [ID 139 ... -
(转metalink)Troubleshooting ORA-27300 ORA-27301 ORA-27302 errors [ID 579365.1]
2010-05-11 14:47 8396Troubleshooting ORA-27300 ORA-2 ... -
ORA-27054 ERRORS WHEN RUNNING RMAN WITH NFS
2010-05-07 14:43 1894Subject: ORA-27054 ERRORS WHEN ... -
DBA日常工作职责(转载 eygle)
2010-01-13 09:12 1853DBA的工作职责是什么?每天DBA应该做哪些工作?稳定环境中的 ... -
Parameter DIRECT: Conventional Path Export Versus Direct Path Export
2009-12-10 10:11 11481. Introduction. 1.1. Starting ... -
ORA-600 [srsnext_1] when running 9.2 on AIX 5.2 [ID 262851.1]
2009-12-02 14:49 1031ORA-600 [srsnext_1] when runnin ... -
PSU--Oracle数据库补丁管理的重要改进
2009-11-30 15:23 29302009年10月20日,Oracle公 ... -
监听文件 LISTENER.ORA 各参数意思
2009-11-20 21:55 2070监听文件 LISTENER.ORA 各参数意思 The fo ... -
dba要做的事
2009-11-14 18:40 946dba要做的事 ORACLE数据库管理员应按如下方式对ORAC ... -
ORA-00600 [kglobpn_1] -- metalink
2009-11-11 13:35 1572Application Received ORA-00600 ... -
ORACLE 查看用户密码修改时间
2009-10-06 15:46 5912ORACLE 查看用户密码修改时间 1。当前数据库版本为 ...
相关推荐
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 ...
有此思维导图,能快速梳理知识点,帮助记忆,帮助找出重点。另一方面,该系统分析师思维导图,是在网上其他类似资料的基础上,本人亲自精心编纂、制作而成。望各位尊重原创的劳动,谢谢! 原创不易,请给好评,谢谢...
提出一种基于程序动态指令进行分析和建模从而快速获取软错误结果的方法。将程序转化为动态指令序列,通过体系结构正确执行分析将所有可能的软错误划分为对程序运行结果有影响和没有影响两部分;基于动态依赖图建立软...
确实不只抓包这么简单,课程内容除了简单介绍了Wireshark的功能之后,快速进入了Wireshark网络分析实践的核心课程内容。课程内容包括了课程用到的实验环境搭建,网络链路层安全,网络层安全,传输层安全,应用层安全...
数据中心需求分析报告---v1 项目概述 项目背景 "十二五"是我国经济结构战略性调整和转变经济发展方式的重要时期,产业结构、收入分配结构和消费结构面临重大调整,国民收入和消费水平逐步提高,我国将全面进入机动化...
不管你是一个IT高级工作者还是一个开发者,你都会发现sysinternals工具可以帮助您管理、故障分析和诊断你的Windows系统和应用程序. 如果您有关于如何使用这些工具的问题,请访问sysinternals论坛从其他用户和我们的...
本资源为一份精心整理的软考高级项目管理师(高项)学习笔记,涵盖了核心名词、案例分析、论文素材等200多项内容,是考生备考高项考试的必备资料。结合作者丰富的备考经验和考试心得,为考生提供了一份全面、系统、...
该方法在软/硬件实现方面采用模块化设计,可嵌入已有的快速成型设备及控制程序中。实例分析结果表明,使用该方法进行预热优化控制,可提高成型件的曲面完整度及机械强度,提高成型效率,减少失败次数。
教你多维度筛选分析数据,优化店铺及流量增长,通过学习本直通车内容,有助于大家快速洞察搜索词,从多维度筛选分析数据,优化店铺及流量增长。 视频大小:2.2G
此为软考所整理的资料,具体内容一看便知道,建议搭配 我账户其它资料,如金色考点,思维导图等等,可以快速构建软考知识体系
属性约简的效率是粗糙集等软计算理论的核心问题之一。为了提高约简效率,在分析不可分辨关系和基数排序特点的基础上,提出了一种时间复杂度为O(|C||U|)的求核算法。然后,运用改进的属性重要度作为启发信息,得到...
ARIS企业流程分析规划软体中文快速导引手册.doc
4、储备分析: 1)应急储备:"已知-未知"风险。 2)管理储备:"未知-未知"风险。 5、进度压缩: 1)赶进度:增加资源,以最小成本开展;可能导致风险、成本的增加。 2)快速跟进:并行开展。 6、资源平衡:...
本研究旨在暗示一种灵敏而可靠的分析方法,通过气相色谱-质谱法(GC-MS)对食品中的两类防腐剂(即羧酸和酚类化合物)进行定量,旨在监测食品中可用的产品。当地商店。 通过水相氯甲酸异丁酯介导的反应,然后通过...
利用扫描电镜以及X射线能谱仪对荣华煤矿软岩巷道...在分析黏土矿物水化膨胀机理之后,通过现场变形监测证实黏土矿物膨胀变形具有长期性、快速性的特点,建议采用阻断黏土矿物与水接触的控制方法,避免水化膨胀现象的产生。
本套课程秉承理论与实践结合的原则,内容包括数据分析思维的讲解,Excel、Tableau、MySQL、Python等软件的安装教程视频、基础操作以及案例视频与分析等,帮助想学会数据分析的小伙伴快速掌握各种数据分析软件,提升...
国内几大运营 商也加入到软交换网络建设中,从引入角度看,无非有两种...本文主要对软交换组网的若干问题进行探讨,着重分析软交换网络组织、IP承载网组织、安全性设计和编号等四个方面,并给出近期可实施的解决方案。
2009年-2018年系统分析师软考历年真题与答案,适合考前刷题,快速提高考试成绩,增加通过概率,祝每个软考考生顺利通过软考,取得资格证!