Oracle数据库内存结构
Oracle数据库创建和使用内存结构有多样的目的,如存储运行的程序块、共享使用的数据和用户连接的私有数据 。
内存结构主要有两部分:
-System Global Area(SGA) 系统全局区:包含Oracle数据库实例的数据和控制信息。
SGA被服务器和后台进程所共享。
SGA中存储的数据有高速缓存的数据块和共享SQL区域等等。
-Program Global Area(PGA)程序全局区:包含服务器或后台进程的数据和控制信息的内存区域。
PGA是在启动服务器或后台进程时由Oracle数据库创建的非共享内存。
每个服务器进程和后台进程都有自己的PGA。
System Global Area(SGA)所包含的组件
-Shared pool共享池:缓存用户之间的各种组织
-Database buffer cache数据库高速缓冲区:缓存数据库检索的数据块
-Keep buffer cache保留缓冲区:一种特殊的高速缓冲区,用于长时间保留在内存中的数据块
-Recycle buffer cache回收缓冲区:用于快速从缓冲区删除或回收数据块
-nK buffer cache指定块大小缓冲区:用于保存不同于默认的数据库块大小的高速缓冲区。2K,4K,8K,16K,32K
-Large pool大池:为某些大型进程(如Oracle备份、恢复和并行)提供大内存分配的可选区域
-Redo log buffer重做日志缓冲区:用于将内存中的脏数据写入到磁盘上的物理重做日志文件
-Streams pool流池:用于存储Oracle流捕获和应用信息
-Java pool java池:用于特定的java代码和java虚拟机(JVM)的数据
动态SGA中可以对database buffer cache、shared pool、larger pool、java pool和streams pool动态调整并且不用关闭实例。
Program Global Area(PGA)程序全局区
-Stack space 栈空间
-User global area(UGA) 用户全局区
数据库初始化参数memory_target和memory_max_target设定一个目标内存大小,数据库自动管理和调优sga和pga。
SHARE POOL(共享池)
参数:shared_pool_size
-Library cache库高速缓存:
-Shared SQL area共享SQL区域:包含SQL语句语法分析树和执行计划。
-Data dictionary cache数据字典缓存:也称为行高速缓存,它以行的形式存放数据,而不是以缓冲区的形式存放数据(缓冲区用于存放完整的数据块)
-Control structure控制结构
-Fixed Area固定区域:表示SGA的启动开销,它非常小
Shared Pool
->Library Cache(SQL、PL/SQL、control structure-lock/library cache handles) soft parse/library cache hit. hard parse/library cache miss
->Shared SQL Area(语句解析树、执行计划)
->Private SQL Area
数据库执行步骤:
1.检查共享池,查看共享SQL区是否已存在语法和语义相同的语句。
如果存在相同的语句,数据库使用共享SQL区的指令,从而减少内存消耗的执行。
如果不存在相同的语句,则数据库分配共享SQL存放此语句。相同的语法,但不同的语义的语句使用子游标。
2.分配一个私有SQL区给会话
私有SQL区的位置取决于会话建立的连接。如果会话是通过共享服务器连接,则该私有SQL区的一部分存放在SGA。
Process Client->Server Process[PGA]->[SGA[Shared Pool[Library Cache[Shared SQL Area]]]]
->Data Dictionary Cache
->Server Result Cache
->Reserved Pool
查询Shard pool大小
select sum(bytes)/1024/1024 mb from v$sgastat where pool=‘shared pool‘; select POOL, NAME, BYTES, BYTES/1048576 as MBytes from v$sgastat where pool=‘shared pool‘ order by BYTES desc;
可以通过x$ksmsp(KSMSP是Kernel Service layer Memory management Sga heaP的缩写)表来详细观察共享池的详细情况。这个表显示了空闲的内存,可以释放的内存,以及为当前共享池容纳不下的大型语句所保留的内存,每一行代表共享池中的一块内存。
SELECT KSMCHCLS CLASS, COUNT(KSMCHCLS) NUM, SUM(KSMCHSIZ) SIZ, To_char( ((SUM(KSMCHSIZ)/COUNT(KSMCHCLS)/1024)),‘999,999.00‘)||‘k‘ "AVG SIZE" FROM X$KSMSP GROUP BY KSMCHCLS; x$ksmsp表中的列含义如下: addr:该行在固定表的数组中的地址 indx:该行在固定表的数组中的索引号码 inst_id:oracle实例编号 ksmchcom:分配的内存块的描述 ksmchsiz:这块分配的共享池内存块的大小 ksmchptr:这块分配的内存块的物理地址 ksmchcls:这块分配的共享池内存块的类型 ksmchcls 主要有四类,说明如下: free Free chunks--不包含任何对象的chunk,可以不受限制的被分配. recr Recreatable chunks--包含可以被临时移出内存的对象,在需要的时候,这个对象可以 被重新创建.例如,许多存储共享sql代码的内存都是可以重建的. freeabl Freeable chunks--包含session周期或调用的对象,随后可以被释放.这部分内存有时候 可以全部或部分提前释放.但是注意,由于某些对象是中间过程产生的,这些对象不能 临时被移出内存(因为不可重建). perm Permanent memory chunks--包含永久对象.通常不能独立释放. 我们可以通过查询x$ksmsp视图来考察shared pool中存在的内存片的数量 不过注意:Oracle的某些版本(如:10.1.0.2)在某些平台上(如:HP-UX PA-RISC 64-bit)查 询该视图可能导致过度的CPU耗用,这是由于bug引起的.
查看共享内存整体的统计
select * from V$LIBRARY_CACHE_MEMORY;
v$sga_resize_ops记录已完成的近期850次SGA组件重定义大小的操作,注意是已经完成
v$sga_current_resize_ops它仅记录当前正在操作中的SGA组件重定义操作,注意是正在操作中的
SELECT start_time, component, oper_type, oper_mode, initial_size / 1024 / 1024 "INITIAL", final_size / 1024 / 1024 "FINAL", end_time FROM v$sga_resize_ops WHERE component IN ( ‘DEFAULT buffer cache‘, ‘shared pool‘ ) AND status = ‘COMPLETE‘ ORDER BY start_time, component;
DATABASE BUFFER CACHE(数据库缓冲区高速缓存)
参数:db_cache_size
-存放从数据文件读取的数据块的副本
-由所有并行用户共享
用于存放从数据文件中读取的块镜像或动态构造的块镜像,以便符合读一致性模型要求。并行连接到实例的所有用户共享对数据库缓冲区高速缓存的访问。
Oracle DB用户进程第一次请求特定的数据块时,将在数据库缓冲区高速缓存中搜索数据。如果该进程在数据库缓冲区高速缓存中找到数据(称为高速缓存命中),则直接从内存中读取数据。如果进程在高速缓存中找不到数据(称为高速缓存未命中),则在访问数据之前,必须将磁盘上的数据文件中的数据块复制到高速缓存中的缓冲区中。
高速缓存中的缓冲区由一个复杂算法管理,该算法组合使用最近最少使用(LRU:Lasst Recently Used"最近最少使用的页面置换算法")列表和停靠计数。LRU有助于确保最近使用的块往往都留在内存中,从而最大限度地减少磁盘访问。
KEEP BUFFER CACHE和RECYCLE BUFFER CACHE用于优化专用缓冲区池。
参数:db_keep_cache_size&db_recycle_cache_size
keep buffer cache用于延长缓冲区在内存中的保留时间,使其比使用LRU时的正常保留时间长。
recycle buffer cache用于加快内存中的缓冲区的刷新速度,使其比使用LRU是的正常刷新速度快。
nK buffer cache用于配置更多缓冲区高速缓存,以用于存放大小与默认块大小不同的数据块。
REDO LOG BUFFER(重做日志缓冲区)
参数:log_buffer(不能动态调整)
-存放有关对数据库所做更改的信息
-包含重做条目,这些条目包含对DML和DDL等操作所做的更改的重做信息。需要时,将使用重做条目进行数据库恢复。
服务器进程更改缓冲区高速缓存时,将会生成重做条目,并将其写入SGA中的重做日志缓冲区。重做条目占用缓冲区中连续的顺序空间。日志写进程后台会将重做日志缓冲区写入磁盘上的活动重做日志文件(或文件组)中。
LARGE POOL(大池)
参数:large_pool_size
-包含组件
I/O buffer(I/O缓冲区)、Free memory(空闲空间)、Parallel Query(并行查询)、Response queue(响应队列)、Request queue(请求队列)、Advanced Queuing(高级排列)
-共享服务器和Oracle XA接口(在事务处理与多个数据库交互时使用)的会话内存。
-I/O服务器进程
-Oracle DB备份和还原操作
-并行查询操作
-高级队列内存表存储
通过从large pool大池中为共享服务器、Oracle XA和并行查询分配会话内存,Oracle DB主要使用shared pool共享池来共享SQL,并避免由于收缩共享SQL高速缓存而导致的性能开销。
Oracle DB备份和还原操作、I/O服务器进程和并行查询的内存空间需要以百KB的缓冲区进行分配,与shared pool共享池相比,large pool大池可以更好地满足此类大型内存请求。
large pool大池不是有最近最少使用(LRU)列表管理的。
JAVA POOL(Java池)
参数:java_pool_size
-java池内存用于存储JVM中所有特定于会话的java代码和数据
STREAMS POOL(流池)
参数:streams_pool_size
-流池由oracle streams独占使用,流池存储缓冲的队列消息,并且为oracle streams捕获进程和应用进程提供内存。
PROGRAM GLOBAL AREA(PGA)程序全局区
程序全局区(PGA)是一个专用内存区,其中包含服务器进程的数据及控制信息。每个服务器进程都有独立的PGA。PGA只能由相应的服务器进程访问,并且只有代表该服务器进程的Oracle代码可以读取它。
每个PGA都包含堆栈空间。在专用服务器环境中,连接到数据库实例的每个用户都有单独的服务器进程。对于这种类型的连接,PGA包含一个用户全局区(UGA)的内存:
PGA:堆栈空间和用户全局区(UGA)
UGA:
-Cursor area 游标区,用于存储游标运行时的信息
-User session 用户会话数据存储区,用于存储有关会话的控制信息
-SQL working SQL工作区,用于处理SQL语句,包括以下
-sort area 排序区,用于对数据排序的函数,如order by he group by
-hash area 散列区,用于执行表的散列连接
-create bitmap area 位图创建区,用于创建数据仓库常用的位图索引
-merge bitmap area 位图合并区,用于解析位图索引计划的执行
在共享服务器环境中,多个客户端用户共享服务器进程。在这种模式下,UGA将移入SGA(共享池shared pool,也可能是大池 large pool),PGA仅包含堆栈空间。
参考: