Oracle内存结构由系统全局区SGA和程序全局区PGA组成。
SGA是实例启动的时候分配的Oracle实例中的一个基本成分。
PGA是服务器进程启动时分配。
1.系统全局区SGA
系统全局区SGA由:Shared Pool, Database Buffer Cache, Redo Log Buffer,Large Pool,Java Pool等组成,其中Large Pool,Java Pool是可选的。
1.1 Shared Pool
Shared Pool用来存储最近最多执行的SQL语句和最近最多使用的数据定义。它包括:Library Cache和Data dictionary cache。它的大小由SHARED_POOL_SIZE这个参数决定。
1.1.1 Library Cache
library cache存储最近最多执行的SQL和PLSQL语句信息,使用LRU算法进行管理,由共享SQL区和共享PLQSQL区两种结构组成。
1.1.2 Data dictionary cache
Data dictionary cache是数据库里最经常访问的对象的定义的集合。包括:数据文件名,表,索引,列,用户权限等数据库对象信息。在解析期间,服务器进程会查找数据字典获取允许接入的关联对象信息。缓存数据字典信息在内存区能提高查询数据的响应时间。它的大小由shared pool的大小决定。
1.2 Database Buffer Cache
存储以前从数据文件中取出过的数据块的拷贝信息。当修改或得到数据时能使性能提高。它使用LRU算法进行管理。由DB_BLOCK_SIZE决定大小。由独立的子缓存组成:DB_CACHE_SIZE,DB_KEEP_CACHE_SIZE,DB_RECYCLE_CACHE_SIZE。可以动态改变尺寸。DB_CACHE_ADVICE可以设置以收集统计信息来预测不同缓冲区大小。
1.3 Redo Log Buffer
重做日志缓冲区记录数据块所有变化,首要目的是恢复,记录的信息可用来重做改变,尺寸由LOG_BUFFER定义。
1.4 Large Pool
Large Pool是SGA中的一个可选的区域,只配置在共享服务器环境中,能减轻共享池的负担,用在UGA,备份和恢复等操作中,大小由LARGE_POOL_SIZE决定。
1.5 Java区
Java区是为了解开Java命令,如果安装并使用Java是必须的,大小由JAVA_POOL_SIZE参数决定。
2. 程序全局区(PGA)
PGA是每个用户进程连接Oracle数据库分配的区域。
用户进程连接到Oracle实例时,就会创建一个对应的会话,该会话使用一个服务器进程来完成客户端与Oracle实例之间的通信。
每个服务器进程都有一个自己的PGA。PGA由Oracle为服务器进程分配,专门用于作为当前用户会话的内存区。
这个内存区是非共享的,只有服务器进程本身才能访问它自己的PGA区。而SGA区则是所有服务器进程都能共享,可写的内存区。