library cache —— latch: library cache

来源:互联网 发布:做网络销售股票犯法吗 编辑:程序博客网 时间:2024/05/22 09:01

为了寻找空闲chunk,通过shared pool锁存器,实现保护扫描空闲列和分配适当chunk;为了执行sql,通过library cache锁存器,保护检索并管理高速缓冲区的所有工作。在获得library cache锁存器过程中,若发生争用,则等待latch: library cache事件。

library cache锁存器争用主要在如下情况下发生:

 

1、Hard Parsing或Soft Parsing过多时

shared pool锁存器争用主要是因Hard Parsing引起的空闲列检索;与此相同,library cache锁存器争用的最重要原因也是Hard Parsing。library cache锁存器争用比shared pool锁存器争用更严重。其理由是library cache锁存器争用在Soft Parsing时也会发生。
利用session_cached_cursors参数。如果此值已被设定,oracle就将已执行三次以上的sql cursor的信息保存到PGA内,所保存的信息是SQL文本和对于库高速缓冲区的指针值。用户请求执行sql时,oracle将确认PGA上是否存在其信息。若存在,则立即向SGA相应区域移动。因而,检索库高速缓冲区的时间将减少,相应的拥有library cache锁存器的时间也会随之减少。卓越的oracle专家 Thom as Kyte将这些session_cached_cursors功能称为“softer soft parsing”。softer soft parsing是减少Soft Parsing自身负担的Parsing方法。

2、Version count高时

假设,三名不同用户执行相同的sql语句。三个sql语句完全相同,所以具有相同的Hash值,因此被分配到相同Hash chain的相同句柄(handle)。但是emp表都是不同方案的表,所以实际上是不同的sql语句。这时,oracle将创建与文本相应的父LCO,底下创建三个子LCO管理每个sql信息。三个子LCO实际上存在与匿名列。因具有三个子LCO,所以v$sqlarea视图的version_count列值是与LCO数相同,其值是3。Version count高,意味着因子LCO检索,检索库高速缓冲区的时间延长,因此library cache锁存器争用可能增加。若在特定sql上发生许多library cache锁存器争用,则需要确认相应的sql的Version count。 

 

3、SGA区域发生Page out时

 共享池已经向磁盘Page Out的时候,对该区域发生扫描时,重新将磁盘内容读取到内存过程中(Page In)需要等待,因此对于library cache锁存器的等待时间可能增加。若latch: library cache等待高时,O/S上发生Swap现象,则发生Page Out引起的性能下降的概率较高。

 

虚拟内存运行原理

 在系统中运行的每个进程都需要使用到内存,但不是每个进程都需要每时每刻使用系统分配的内存空间。当系统运行所需内存超过实际的物理内存,内核会释放某些进程所占用但未使用的部分或所有物理内存,将这部分资料存储在磁盘上直到进程下一次调用,并将释放出的内存提供给有需要的进程使用。
在Linux内存管理中,主要是通过“调页Paging”和“交换Swapping”来完成上述的内存调度。调页算法是将内存中最近不常使用的页面换到磁盘上,把活动页面保留在内存中供进程使用。交换技术是将整个进程,而不是部分页面,全部交换到磁盘上。
分页(Page)写入磁盘的过程被称作Page-Out,分页(Page)从磁盘重新回到内存的过程被称作Page-In。当内核需要一个分页时,但发现此分页不在物理内存中(因为已经被Page-Out了),此时就发生了分页错误(Page Fault)。
当系统内核发现可运行内存变少时,就会通过Page-Out来释放一部分物理内存。经管Page-Out不是经常发生,但是如果Page-out频繁不断的发生,直到当内核管理分页的时间超过运行程式的时间时,系统效能会急剧下降。这时的系统已经运行非常慢或进入暂停状态,这种状态亦被称作thrashing(颠簸)。

 

注意

 从Oracle10g开始,Oracle正在逐步用mutex取代library cache中的latch,cursor:pin S和cursor:pin X相当于share和exclusive类型的library cache pin,cursor:pin S wait on X则表示share方式正在等待exclusive锁定。

SQL> select name,parameter1,parameter2,parameter3 from v$event_name where name like '%cursor%';NAME       PARAMETER1      PARAMETER2      PARAMETER3------------------------------ --------------- --------------- ---------------cursor: mutex X        idn       value       wherecursor: mutex S        idn       value       wherecursor: pin X       idn       value       wherecursor: pin S       idn       value       wherecursor: pin S wait on X        idn       value       where


 

原创粉丝点击