欢迎来到天天文库
浏览记录
ID:20389134
大小:186.58 KB
页数:12页
时间:2018-10-13
《共享池之三:librarycache结构librarycacheobject的结构-dumplibraryhandle》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、sharedpool之三:librarycache结构/librarycacheobject的结构-dumpLibraryHandleLibrarycache结构Librarycache最主要的功能就是存放用户提交的SQL语句,SQL语句相关的解析树(解析树也就是对SQL语句中所涉及到的所有对象的展现)--->共享SQL区(sharedSQLareas),私有SQL区(privateSQLareas,如果配置了共享服务器),执行计划,用户提交的PL/SQL程序块(包括匿名程序块,存储过程,包,函数等)以及它们转换后能够被Oracle执行的代码等,为了对这些内存结构进行管理,
2、librarycache中还存放了很多控制结构,包括lock,pin,dependencytable,11G中的mutex等。Librarycache需要解决三个问题:(1).快速定位的问题:Librarycache中对象众多,Oracle如何管理这些对象,以便服务进程可以迅速找到他们需要的信息。比如某个服务进程需要迅速定位某个SQL是否存在于Librarycache中。---Oracle利用hashtable结构来解决librarycache中快速定位的问题(2).关系依赖的问题:Librarycache中的对象存在复杂的依赖关系,当某个objec失效时,可以迅速将依赖其
3、的对象也置为失效状态。比如某个表发生了结构变化,依赖其的SQL语句需要重新解析。---LCO中dependencytable(3).并发控制的问题:Librarycache中必须有一个并发控制的机构,比如锁机制,来管理大量共享对象的并发访问和修改的问题,比如某个SQL在重新编译的同时,其所依赖的对象不能被修改。----LATCHLOCKPINLibrarycache由一个hash表组成,hash表是由hashbuckets组成的数组。每个hashbucket都是包含librarycachehandle的一个双向链表。librarycachehandle指向libraryca
4、cheobject和一个引用列表。librarycache对象进一步分为:依赖表、子表、授权表等同一个SQL语句,HASH值相同,放在同一个librarycachehandle--如绑定变量,是用同一个librarycachehandle下不同的的子游标。不同的SQL语句,HASH值相同放在同一hashbucket的不同librarycachehandle。Hash算法Oracle在内部管理中大量的使用到了hash,使用hash的目的就是为了快速查找和定位.对数值进行hash运算,产生一个索引号,然后根据索引号将数值放置到相应的hashbucket中去.根据hash运算的法
5、则,会产生多个索引号,每一个索引号对应一个hashbucket(一个数值列).在寻找数值的时候,将搜寻的数值进行hash,产生一个索引号,那么这个数值一定在这个索引号对应的hashbucket中,于是直接跳转到这个hashbucket中进行遍历。这样在定位数据的时候,就能够大大的减少遍历的数量。hashbucket:库缓存中就是使用hashbucket来管理的1、首先根据shared_pool_size指定的尺寸来自动计算hashbucket的个数2、每个hashbucket后面都串联着多个句柄 句柄描述了librarycache里面的对象的一些属性,包括名称、标记、指
6、向对象所处的内存地址的指针librarycachehandle:-----OBJECTHandle 一个handle管理着一个librarycacheobject,handle对LCO起到指针作用。Librarycache中所有对象的访问是通过利用librarycachehandle来实现的当一个进程请求librarycacheobject,librarycachemanager就会应用一个hash算法,从而得到一个hash值,根据相应的hash值到相应的hashbucket中去寻找。 如果librarycacheobject在内存中,那么这个librarycachehan
7、dle就会被找到。有时候,当sharedpool不够大,librarycachehandle会保留在内存中,然而librarycacheheap由于内存不足被ageout,这个时候我们请求的objectheap就会被重载。最坏的情况下,librarycachehandle在内存中没有找到,这个时候就必须分配一个新的librarycachehandle,同时objectheap也会被加载到内存中。###############librarycacheobject的结构:--LCO见上图,主要保存SQL的实际信息,包括
此文档下载收益归作者所有