共享池是用来共享sql或者pl/sql语句。以下详细说明
共享池组成:由库高速缓存(library cache)和数据字典调整缓存(data dictionary cache)组成。
库调整缓存(library cache):存放服务器进程(serverce process)将sq或pl/sql的正文和编译的代码以及执行计划。 原因:在进行编译时,服务器进程(serverce process)首先会在共享池中搜索是否有相同的sql或者pl/sql语句(指正文),有就停止继续编译,而直接使用已经存在的编译过的代码和执行计划。提示:库高速缓存包含了共享sql区和pl/sql区,它们分别存放sql和Pl/sql语句以及相关信息。
数据字典高速缓存(data dictionary cache):存放oracle服务在执行sql语句时,服务器进程(serverce process)将把数据文件、表、索引、列、用户和其它的数据对象的定义和权限的信息。 原因:存放在这儿之后,当有进程(用户)需要同样的信息,如表和列的定义,那么所有的信息都将从数据字典高速缓存中获得。巧合的是,这些信息同时也存放在oracle数据库的数据字典中,也许这就是把该内存叫做数据字典高速缓存的原因吧。
实现共享sql或pl/sql语句的要求:第一,库高速缓存要足够大,目的是防止sql或pl/sql语句不会很快被淘汰;第二,sql或pl/sql语句要是能共享的通用代码,原因是oracle是通过比较sql或pl/sql语句的正文来决定两个语句是否相同的,只有当两个语句的正文完全相同时,oracle才重用已经存在的编译好的代码和执行计划。
注意:oracle并没有提供直接设置库高速缓存大小的方法,只能通过设置共享池的大小来间接地设置库调整缓存的大小。
实现表和列的定义等重用要求:表和列的定义等重用的机会要比sql语句大,为达到能实现共享这些信息的目的,数据字典高速缓存应该尽可能设置大一些。
注意:和库高速缓存一样,oracle并没有提供直接设置数据字典高速缓存大小的方法,只能通过设置共享池的大小来间接地设置数据字典高速缓存的大小。
提示:即使把共享池设置得足够大且所使用的sq或者pl/sql语句是能共享的代码,oracle也并不能一定使用共享池内存中的代码。例如当有用户修改了某个对象的定义之后,所有使用这个对象的共享内存池中的代码全部被oracle设置为无效,因此在使用时必须重编译。
修改共享池大小:alter system set shared_pool_size=64M