共享池主要用来存储各种类型的程序数据,比如存储解析后的SQL、PL/SQL代码、系统参数和数据字典信息,主要由库缓存(Library Cache)、数据字典缓存(Data Directory Cache)、服务器结果缓存(Server Result Cache)组成。
库缓存(Library Cache):主要存放所有编译过且可执行的SQL语句和PL/SQL代码,是SQL语句,PL/SQL代码执行编译的区域。在执行SQL语句时,数据库尝试重用以前执行的代码。如果SQL语句的解析已经存在于库缓存中,并且可以共享,那么数据库将重用该代码,称为软解析或库缓存命中;否则,数据库必须为应用程序代码构建一个新的可执行版本,称为硬解析或库缓存丢失。数据库使用共享SQL区域来处理SQL语句第一次出现,所有用户都可以访问该区域,以及该区域中包含的语句解析树和执行计划。对于唯一的语句,只存在一个共享SQL区域。发出SQL语句的每个会话在其PGA中都有一个私有SQL区域。提交相同语句的每个用户都有一个私有SQL区域,指向相同的共享SQL区域。因此,单个PGA中的许多私有SQL区域可以与相同的共享SQL区域相关联。
数据字典缓存(Data Directory Cache):存储的是数据库表和视图的集合,其中包含有关数据库、数据库结构和数据库用户的引用信息,以备共享。
服务器结果缓存(Server Result Cache):是共享池中的一个内存池,与缓冲池不同,服务器结果缓存保存的是结果集(包含SQL查询结果缓存和PL/SQL函数结果缓存),而不是数据块。