概述
关于内存的配置,是最影响 Oracle性能的配置。内存还直接影响到其他两个重要资源的消耗: cpu 和 IO.
那Oracle 内存存储的主要内容是什么呢?
- 程序代码( PLsql、 Java);
- 关于已经连接的会话的信息,包括当前所有活动和非活动会话;
- 程序运行时必须的相关信息,例如查询计划;
- Oracle 进程之间共享的信息和相互交流的信息,例如锁;
- 那些被永久存储在外围存储介质上,被 cache 在内存中的数据( 如 redo log 条目,数据块)。
每个 Oracle 数据库都是由 Oracle Instance(实例)与数据库(数据文件,控制文件、重做日志文件)组成,其中所谓实例就是用户同数据库交互的媒介,用户通过于一个实例相连来操作数据库。
而实例又是由统一的内存结构( SGA,PGA, UGA)和一批内存驻留进程组成。
实例在操作系统中用 ORACLE_SID 来标识,在 Oracle 中用参数 INSTANCE_NAME 来标识, 它们两个的值是相同的。
数据库启动时,系统首先在服务器内存中分配系统全局区( SGA), 构成了 Oracle的内存结构,然后启动若干个常驻内存的操作系统进程,即组成了 Oracle 的 进程结构,内存区域和后台进程合称为一个 Oracle 实例。
SGA (System Gloable Area)
架构图
SGA概述
SGA 是一组为系统分配的共享的内存结构,可以包含一个数据库实例的数据或控制信息。
如果多个用户连接到同一个数据库实例,在实例的 SGA 中,数据可以被多个用户共享。
当数据库实例启动时, SGA 的内存被自动分配;当数据库实例关闭时, SGA 内存被回收。
SGA 是占用内存最大的一个区域,同时也是影响数据库性能的重要因素。
SGA 区是可读写的。所有登录到实例的用户都能读取 SGA 中的信息,而在oracle 做执行操作时,服务进程会将修改的信息写入 SGA 区。
SGA 主要包括了以下的数据结构:
- 数据缓冲( Buffer Cache)
- 重做日志缓冲( Redo Log Buffer)
- 共享池( Shared Pool)
- Java 池( Java Pool)
- 大池( Large Pool)
- 流池( Streams Pool — 10g 以后才有)
- 数据字典缓存( Data Dictionary Cache)
- 其他信息(如数据库和实例的状态信息)
SGA 中的数据字典缓存 和其他信息 会被实例的后台进程所访问,它们在实例启动后就固定在 SGA 中了,而且不会改变,所以这部分又称为固定 SGA( Fixed SGA)。这部分区域的大小一般小于 100K。
Shared Pool、 Java Pool、 Large Pool 和 Streams Pool 这几块内存区的大小是相应系统参数设置而改变的,所以有通称为可变 SGA( Variable SGA)。
查看SGA信息
使用有DBA权限的用户
sql> show parameter sga
NAME TYPE VALUE
------------------- ----------- --------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 6256M
sga_target big integer 0