share pool library cache oracle 内存结构
1.library cache的作用
library cache最主要的功能就是存放用户提交的SQL语句、SQL语句相关的解析树(解析树也就是对SQL语句中所涉及到的所有对象的展现)、执行计划、用户提交的PL/SQL程序块(包括匿名程序块、存储过程、包、函数等)以及它们转换后能够被oracle执行的代码等。为了对这些内存结构进行管理,还存放了很多控制结构,包括lock、pin、dependency table等。library cache还存放了很多的数据库对象的信息,包括表、索引等等。有关这些数据库对象的信息都是从dictionary cache中获得的。如果用户对library cache中的对象信息进行了修改,则这些修改会返回到dictionary cache中。
在library cache中存放的所有的信息单元都叫做对象(object),这些对象可以分成两类:一类叫存储对象,也就是上面所说的数据库对象。它们是通过显式的 SQL语句或PL/SQL程序创建出来的,如果要删除它们,也必须通过显示的SQL命令进行删除。这类对象包括表、视图、索引、包、函数等等;另一类叫做过渡对象,也就是上面所说的用户提交的SQL语句或者提交的PL/SQL程序块等。这些过渡对象是在执行SQL语句或PL/SQL程序的过程中产生的,并缓存在内存里。如果实例关闭则删除,或者由于内存不足而被交换出去,从而被删除。
当用户提交SQL语句或PL/SQL程序块到oracle的shared pool以后,在library cache中生成的一个可执行的对象,这个对象就叫做游标(cursor)。不要把这里的游标与标准SQL(ANSI SQL)的游标混淆起来了,标准SQL的游标是指返回多条记录的SQL形式,需要定义、打开、关闭。下面所说到的游标如无特别说明,都是指library cache中的可执行的对象。游标是可以被所有进程共享的,也就是说如果100个进程都执行相同的SQL语句,那么这100个进程都可以同时使用该SQL 语句所产生的游标,从而节省了内存。每个游标都是由library cache中的两个或多个对象所体现的,至少两个对象。一个对象叫做父游标(parent cursor),包含游标的名称以及其他独立于提交用户的信息。从v$sqlarea视图里看到的都是有关父游标的信息;另外一个或多个对象叫做子游标(child cursors),如果SQL文本相同,但是可能提交SQL语句的用户不同,或者用户提交的SQL语句所涉及到的对象为同名词等,都有可能生成不同的子游标。因为这些SQL语句的文本虽然完全一样,但是上下文环境却不一样,因此这样的SQL语句不是一个可执行的对象,必须细化为多个子游标后才能够执行。子游标含有执行计划或者PL/SQL对象的程序代码块等。
2.library cache的信息获取
select * from v$libraryCache;Column | Datatype | Description |
---|---|---|
NAMESPACE |
VARCHAR2(15) |
Library cache namespace |
GETS |
NUMBER |
Number of times a lock was requested for objects of this namespace |
GETHITS |
NUMBER |
Number of times an object's handle was found in memory |
GETHITRATIO |
NUMBER |
Ratio ofGETHITS toGETS |
PINS |
NUMBER |
Number of times a PIN was requested for objects of this namespace |
PINHITS |
NUMBER |
Number of times all of the metadata pieces of the library object were found in memory |
PINHITRATIO |
NUMBER |
Ratio ofPINHITS toPINS |
RELOADS |
NUMBER |
AnyPIN of an object that is not the firstPIN performed since the object handle was created, and which requires loading the object from disk |
INVALIDATIONS |
NUMBER |
The total number of times objects in this namespace were marked invalid because a dependent object was modified |
DLM_LOCK_REQUESTS |
NUMBER |
Number ofGET requests lock instance locks |
DLM_PIN_REQUESTS |
NUMBER |
Number of PIN requests lock instance locks |
DLM_PIN_RELEASES |
NUMBER |
Number of release requests PIN instance locks |
DLM_INVALIDATION_REQUESTS |
NUMBER |
Number ofGET requests for invalidation instance locks |
DLM_INVALIDATIONS |
NUMBER |
Number of invalidation pings received from other instances |