Chinaunix首页 | 论坛 | 博客
  • 博客访问: 89438
  • 博文数量: 26
  • 博客积分: 920
  • 博客等级: 准尉
  • 技术积分: 235
  • 用 户 组: 普通用户
  • 注册时间: 2006-06-28 10:50
文章分类

全部博文(26)

文章存档

2015年(2)

2011年(1)

2009年(10)

2008年(2)

2007年(1)

2006年(10)

我的朋友

分类: Oracle

2009-02-03 23:51:42

Shared pool latch 和 Library cache latch
 
Shared pool latch是用来保护共享池内部结构,在分配和释放共享池时需要获得latch,在aged out或是释放空间时也要latch。9i之前,共享池内存结构是单独的由Shared pool 啦提出保护,从9i开始,如果server有4个以上的cpu而且Shared pool size大于250M,oracle会动态将共享池分为多个子池,最多可以大调7个sub pool。子池的数量也可以通过_kghdsidx_count参数来手动调整,每个子池有自己的结构、lru列表和shared pool latch。查看Shared pool latch个数:
sql>select a.ksppinm,b.ksppstvl from x$ksppi a,x$ksppsv b
where a.indx=b.indx and a.ksppinm='_kghdsidx_count';
sql>select name,addr, child#, gets, misses from v$latch_children where name = 'shared pool';
Oracle9i之前,过大的共享池会增加Shared pool latch的争用,因为共享池中的空闲内存被分类,并保存在大量的存储桶或空闲列表上,较大的共享池趋向于较长的空闲列表,进程在获得共享池内存池之前,需要持有latch扫描很长的空闲列表,这在高度并发的系统中可能会生产 latch争用,特别是一些不使用绑定变量的系统。
 
查看Library cache latch 个数
select name,addr, child#, gets, misses from v$latch_children where name = 'library cache';
 
Library cache latch争用通常出现在具有高版本数的sql语句中,这些sql的表面字义是相同的如select * from test,但可能属于不同的底层如schema,因为这些sql具有相同的散列值和不同的版本,oracle需要去比较该语句和现有版本,这期间需要一直持有latch的,这可能会造成其他进程无法获得 latch。
查询version_count高版本的语句
 select substr(sql_text,1,40),version_count
  from v$sqlarea where version_count > 0  order by version_count desc;

总的来说,shared pool和library cache争用主要出现在频繁的硬解析上,而过多的硬解析通常又和绑定变量存在关系,说了半天还是回到应用上,共享池的健壮性主要还是取决于应用的设计,而不不仅仅是参数的调整。

在记录一个重要的性能视图  select * from v$librarycacle;

阅读(1074) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~