ITPUB??ì3
新一届的微软MVP评选已经开始,欢迎各位推荐!
ITPUB论坛 » Oracle专题深入讨论 » 关于shared pool的深入探讨(二)

标题: [精华] 关于shared pool的深入探讨(二)
离线 Arrayeygle
天下有雪


精华贴数 65
个人空间 0
技术积分 206744 (1)
社区积分 6444 (232)
注册日期 2001-10-8
论坛徽章:60
现任管理团队成员ITPUB长老会主席2007年度ITPUB杰出贡献ITPUB长老会成员ITPUB元老ITPUB维基人
授权会员2008北京奥运纪念徽章:跳水2008北京奥运纪念徽章:柔道2008北京奥运纪念徽章:射击生肖徽章2007版:鼠2008年新春纪念徽章

发表于 2004-8-22 21:50 
关于shared pool的深入探讨(二)

link:
http://www.eygle.com/internal/shared_pool-2.htm

我们继续把前面的问题展开一下.

其实我们可以从数据库内部监控shared pool的空间碎片情况.
这涉及到一个内部视图x$ksmsp

X$KSMSP的名称含义为: [K]ernal [S]torage [M]emory Management [S]GA Hea[P]
其中每一行都代表着shared pool中的一个chunk

首先记录一下测试环境:
PHP code:


SQL
select from v$version;



BANNER

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

Oracle9i Enterprise Edition Release 9.2.0.3.0 Production

PL
/SQL Release 9.2.0.3.0 Production

CORE    9.2.0.3.0       Production

TNS 
for LinuxVersion 9.2.0.3.0 Production

NLSRTL Version 9.2.0.3.0 


SQL
desc x$ksmsp

 Name                                      Null
?    Type

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

 
ADDR                                               RAW(4)

 
INDX                                               NUMBER

 INST_ID                                            NUMBER

 KSMCHIDX                                           NUMBER

 KSMCHDUR                                           NUMBER

 KSMCHCOM                                           VARCHAR2
(16)

 
KSMCHPTR                                           RAW(4)

 
KSMCHSIZ                                           NUMBER

 KSMCHCLS                                           VARCHAR2
(8)

 
KSMCHTYP                                           NUMBER

 KSMCHPAR                                           RAW
(4)

我们关注以下几个字段:

KSMCHCOM是注释字段,每个内存块被分配以后,注释会添加在该字段中.
x$ksmsp.ksmchsiz代表块大小

x$ksmsp.ksmchcls列代表类型,主要有四类,说明如下:

free
Free chunks--不包含任何对象的chunk,可以不受限制的被分配.

recr
Recreatable chunks--包含可以被临时移出内存的对象,在需要的时候,这个对象可以
被重新创建.例如,许多存储共享sql代码的内存都是可以重建的.

freeabl
Freeable chunks--包含session周期或调用的对象,随后可以被释放.这部分内存有时候
可以全部或部分提前释放.但是注意,由于某些对象是中间过程产生的,这些对象不能
临时被移出内存(因为不可重建).

perm
Permanent memory chunks--包含永久对象.通常不能独立释放.

我们可以通过查询x$ksmsp视图来考察shared pool中存在的内存片的数量
不过注意:Oracle的某些版本(如:10.1.0.2)在某些平台上(如:HP-UX PA-RISC 64-bit)查
询该视图可能导致过度的CPU耗用,这是由于bug引起的.

我们看一下测试:
PHP code:


初始启动数据库
,x$ksmsp中存在2259个chunk



SQL
select count(*) from x$ksmsp;



  
COUNT(*)

----------

      
2259





执行查询
:



SQLselect count(*) from dba_objects;



  
COUNT(*)

----------

     
10491



此时shared pool中的chunk数量增加



SQL
select count(*) from x$ksmsp;



  
COUNT(*)

----------

      
2358

.

这就是由于shared pool中进行sql解析,请求空间,进而导致请求free空间,分配、分割
从而产生了更多,更细碎的内存chunk

由此我们可以看出,如果数据库系统中存在大量的硬解析,不停请求分配free的shred pool内存
除了必须的shared pool latch等竞争外,还不可避免的会导致shared pool中产生更多的内存碎片
(当然,在内存回收时,你可能看到chunk数量减少的情况)

我们看以下测试:
PHP code:


首先重新启动数据库
:



SQLstartup force;

ORACLE instance started.



Total System Global Area   47256168 bytes

Fixed Size                   451176 bytes

Variable Size              29360128 bytes

Database Buffers           16777216 bytes

Redo Buffers                 667648 bytes

Database mounted
.

Database opened.



创建一张临时表用以保存之前x$ksmsp的状态:



SQLCREATE GLOBAL TEMPORARY TABLE e$ksmsp ON COMMIT PRESERVE ROWS AS

  
2  SELECT      a.ksmchcom,

  
3           SUM (a.CHUNKCHUNK,

  
4           SUM (a.recrrecr,

  
5           SUM (a.freeablfreeabl,

  
6           SUM (a.SUMSUM

  7      FROM 
(SELECT   ksmchcomCOUNT (ksmchcomCHUNK,

  
8                     DECODE (ksmchcls'recr'SUM (ksmchsiz), NULLrecr,

  
9                     DECODE (ksmchcls'freeabl'SUM (ksmchsiz), NULLfreeabl,

 
10                     SUM (ksmchsizSUM

 11                FROM x$ksmsp GROUP BY ksmchcom
ksmchclsa

 12  where 1 
0

 13  GROUP BY a
.ksmchcom;



Table created.



保存当前shared pool状态:



SQLINSERT INTO E$KSMSP

  2  SELECT      a
.ksmchcom,

  
3           SUM (a.CHUNKCHUNK,

  
4           SUM (a.recrrecr,

  
5           SUM (a.freeablfreeabl,

  
6           SUM (a.SUMSUM

  7      FROM 
(SELECT   ksmchcomCOUNT (ksmchcomCHUNK,

  
8                     DECODE (ksmchcls'recr'SUM (ksmchsiz), NULLrecr,

  
9                     DECODE (ksmchcls'freeabl'SUM (ksmchsiz), NULLfreeabl,

 
10                     SUM (ksmchsizSUM

 11                FROM x$ksmsp

 12            GROUP BY ksmchcom
ksmchclsa

 13  GROUP BY a
.ksmchcom

 14  
/



41 rows created.



执行查询:



SQLselect count(*) from dba_objects;



  
COUNT(*)

----------

     
10492

     

比较前后shared pool内存分配的变化
:



SQLselect a.ksmchcom,a.chunk,a.sum,b.chunk,b.sum,(a.chunk b.chunkc_diff,(a.sum -b.sums_diff

  2  from

  3  
(SELECT   a.ksmchcom,

  
4           SUM (a.CHUNKCHUNK,

  
5           SUM (a.recrrecr,

  
6           SUM (a.freeablfreeabl,

  
7           SUM (a.SUMSUM

  8      FROM 
(SELECT   ksmchcomCOUNT (ksmchcomCHUNK,

  
9                     DECODE (ksmchcls'recr'SUM (ksmchsiz), NULLrecr,

 
10                     DECODE (ksmchcls'freeabl'SUM (ksmchsiz), NULLfreeabl,

 
11                     SUM (ksmchsizSUM

 12                FROM x$ksmsp

 13            GROUP BY ksmchcom
ksmchclsa

 14  GROUP BY a
.ksmchcoma,e$ksmsp b

 15  where a
.ksmchcom b.ksmchcom and (a.chunk b.chunk) <>0

 16  
/



KSMCHCOM              CHUNK        SUM      CHUNK        SUM     C_DIFF     S_DIFF

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

KGL handles             313     102080        302      98416         11       3664

KGLS heap               274     365752        270     360424          4       5328

KQR PO                  389     198548        377     192580         12       5968

free memory              93    2292076         90    2381304          3     
-89228

library cache          1005     398284        965     381416         40      16868

sql area                287     547452        269     490052         18      57400



6 rows selected
.

我们简单分析一下以上结果:
首先free memory的大小减少了89228,这说明sql解析存储占用了一定的内存空间
而chunk从90增加为93,这说明内存碎片增加了.

在下面的部分中,我会着手介绍一下KGL handles,   KGLS heap这两个非常重要的shared pool中的内存结构.


__________________
只看该作者    顶部
离线 dlinger
凌波微步


精华贴数 15
个人空间 0
技术积分 14654 (75)
社区积分 3424 (398)
注册日期 2002-9-24
论坛徽章:9
ITPUB元老Heart of PUBITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念管理团队2006纪念徽章会员2007贡献徽章
会员2006贡献徽章ITPUB新首页上线纪念徽章    

发表于 2004-8-22 22:05 
恩,eygle老师又开始写东西了
支持一下

又有文章可以看了



__________________
Rain or Shine, I am fine.[url="http://knight_dl.photo.163.com"]我的图片社,每天更新[/url]:cool:
只看该作者    顶部
离线 biti_rainy
人生就是如此



精华贴数 37
个人空间 0
技术积分 110918 (4)
社区积分 11770 (123)
注册日期 2001-12-12
论坛徽章:41
现任管理团队成员ITPUB长老会成员ITPUB元老年度论坛发贴之星年度论坛发贴之星ITPUB北京九华山庄2008年会纪念徽章
管理团队2007贡献徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章管理团队2006纪念徽章会员2007贡献徽章会员2006贡献徽章

发表于 2004-8-23 00:03 
好,偶一直都想把这块仔细整理整理,就是没有这个决心,这下有现成的了  


__________________
眼界决定边界,态度决定高度
blog:
人生就是如此
只看该作者    顶部
离线 wzy25
黑骑士



精华贴数 34
个人空间 0
技术积分 32800 (24)
社区积分 564 (1313)
注册日期 2001-12-14
论坛徽章:31
现任管理团队成员ITPUB元老管理团队2007贡献徽章参与2007年甲骨文全球大会(中国上海)纪念月度精华徽章ITPUB北京香山2007年会纪念徽章
管理团队2006纪念徽章会员2007贡献徽章会员2006贡献徽章授权会员2008年新春纪念徽章生肖徽章2007版:鸡

发表于 2004-8-23 00:23 
handle 表示该存在library cache中的对象的描述,相当于buffer head,记录了该对象的各种状态


__________________
wrong_x@hotmail.com
http://wzy25.itpub.net
提供保险核心业务系统咨询,评估业务。提供上海北京及北京周边地区oracle db,oracle as,weblogic技术支持,培训
只看该作者    顶部
离线 d.c.b.a
人生积极一点好


精华贴数 6
个人空间 0
技术积分 14037 (82)
社区积分 1356 (777)
注册日期 2004-2-19
论坛徽章:21
现任管理团队成员Heart of PUBITPUB北京九华山庄2008年会纪念徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章会员2007贡献徽章
ITPUB新首页上线纪念徽章     

发表于 2004-8-23 08:41 
Cool!


__________________

专业Oracle/Shareplex技术支持服务, 管理, 培训, 调优, 备份, 恢复!

个人主页: 订阅AnySQL | AnySQL | dbatools | AUL Step by Step | OracleSOS.com
联系方法: MSN: anysql©live.com, Skype: anysql, QQ: 37223884
只看该作者    顶部
离线 husthxd
版主


精华贴数 8
个人空间 1070
技术积分 60963 (9)
社区积分 3827 (366)
注册日期 2002-2-20
论坛徽章:106
现任管理团队成员ITPUB元老ITPUB北京九华山庄2008年会纪念徽章第18届世界杯(德国)纪念徽章管理团队2006纪念徽章会员2007贡献徽章
会员2006贡献徽章玉石琵琶九尾狐狸紫蜘蛛蓝色妖姬红孩儿

发表于 2004-8-25 23:06 



__________________
少吃饭,多吃菜少说话,多做事少灌水,多看文档-----------------------------------------------------------吃遍全城!------------------------------------------------------------Java钻研中........................................学好英语,报效祖国..........................------------------------------------------------------------人生最幸福的事情莫过于通过自己的努力实现自己的梦想!------------------------------------------------------------http://husthxd.itpub.net
只看该作者    顶部
离线 zhang_yong88
资深会员



精华贴数 0
个人空间 0
技术积分 1778 (929)
社区积分 24 (6922)
注册日期 2002-12-5
论坛徽章:3
ITPUB元老会员2006贡献徽章授权会员   
      

发表于 2004-12-29 14:51 
灌水一下以下是我對比几種類型的被分配的內存塊.
PHP code:


'freeabl'                                    'recr'

KGFF heap                                    ..

KGK contexts                                 

KGK heap                                     
..

KQLS heap                                    ..  KGL handles

LISTEN ADDRESS                                

PL
/SQL DIANA                                 ..

PL/SQL MPCODE                                ..

PL/SQL SOURCE                                ..

PLS cca hp desc                              PLS non-lib hp

PX msg pool                                  
..

PX subheap                                   ..

REGISTRAR TABLE                              errors

SERVICE NAME EN                              fixed allocatio

SERVICE NAMES T

character set m

devs

dictionary cach                              row cache lru

dups

errors

joxs heap

ksfqpa

ksfqpar

ksfqpn

kzull

library cache                                
..

listener addres

multiblock rea

nods

partitioning d                               
..

session param v                              

sql area                                     
..

table definiti                               ..  table columns  temporary tabl

trigger defini                               
..  trigger inform trigger source

                                             

'free';                                      'perm';

free memory                                  perm




只看该作者    顶部
离线 congfalei
初级会员



精华贴数 0
个人空间 0
技术积分 72 (21142)
社区积分 0 (239688)
注册日期 2005-1-4
论坛徽章:0
      
      

发表于 2005-1-4 13:58 
engle老師真厲害!!


__________________
天地任我行
只看该作者    顶部
离线 congfalei
初级会员



精华贴数 0
个人空间 0
技术积分 72 (21142)
社区积分 0 (239688)
注册日期 2005-1-4
论坛徽章:0
      
      

发表于 2005-1-4 14:12 
好好學習.


__________________
天地任我行
只看该作者    顶部
离线 cc59
Love oracle



精华贴数 0
个人空间 326
技术积分 10889 (109)
社区积分 13746 (106)
注册日期 2004-8-13
论坛徽章:68
现任管理团队成员奥运纪念徽章2008北京奥运纪念徽章:帆船2008北京奥运纪念徽章:游泳  
      

发表于 2005-1-5 21:55 
eygle老大真酷.


__________________
My blog: tuning rac and using parallel


msn:liuyi8903@hotmail.com
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问