您的位置:首页 > 其它

内存管理

2013-10-11 22:53 190 查看
Oracle 实例中的内存使用分为两类:

1. 程序全局区(Program Global Area, PGA)

专门供每个会话使用,从 9i 版本开始,PGA 的管理实现自动化。

2. 系统全局区(System Global Area, SGA)

由所有 Oracle 进程共享,从 10g 版本开始,SGA 的管理实现自动化。

11g 版本可以同时管理 PGA 和 SGA

PGA 内存管理

在执行 SQL 语句时,服务器进程使用 PGA 来存储会话特有的数据,包括:

临时表
排序行
合并位图
变量
调用堆栈
每个 SQL 语句都使用 SGA 中的内存(共享池中的共享 SQL 区域),并需要最低限度的 PGA 内存(专用 SQL 区域),否则 SQL 语句将无法执行。
使用两个实例参数来启用自动 PGA 内存管理:

WORKAREA_SIZE_POLICY
PGA_AGGREGATE_TARGET

WORKAREA_SIZE_POLICY 的默认值是 AUTO,这意味着 Oracle 可以根据需要,将 PGA 分配给会话,同时力求将 PGA 分配总量保持在 PGA_AGGREGATE_TARGET 范围内。
PGA_AGGREGATE_TARGET 的默认值是大于 10 MB,或是 SGA 大小的 20%,应对其执行向上调整。
SGA 内存管理
SGA 包含多个内存结构,这些结构的大小可以独立地调整,如下所示:

共享池 (Shared Pool)
数据库缓冲区缓存 (Buffer Cache)
大池 (Large Pool)
流池 (Streams Pool)
Java 池 (Java Pool)
日志缓冲区 (Log Buffer)

分配给大池、Java 池和流池的内存不可转让 -- 只是需要或不需要这样的内存。如果这些结构不够大,那么将发生错误;如果这些结构过大,就不会提高性能。
分配给共享池、数据库缓冲区缓存和日志缓冲区的内存是可转让的:如果达不到最优大小,那么不会发生错误,但性能会因此下降。共享池是一个例外:如果在较长时间内达不到最优大小,那么将会发生错误。
SGA 内存管理可以自动进行,但日志缓冲区例外。日志缓冲区是一个 SGA 组件,其大小在启动实例时固定下来,无法进行自动管理。
手动管理 SGA 的参数如下:

SHARED_POOL_SIZE
DB_CACHE_SIZE
LARGE_POOL_SIZE
STREAMS_POOL_SIZE
JAVA_POOL_SIZE

要启用 SGA 自动管理,则保留使用所有这些参数的默认值(或将其设置为 0),并设置一个参数来启用自动共享内存管理(Automatic Shared Memory Management, ASSM):

SGA_TARGET
在使用 ASSM 时,实例将监视各个 SGA 组件的内存需求,并根据需要将内存分配给组件,如有必要,就会减少内存容量,以便将内存分配总量控制在目标范围内。包含在目标范围的还有日志缓冲区,其大小使用静态的 LOG_BUFFER 参数进行设置:在启动实例时创建日志缓冲区,其大小以后不能再调整。

LOG_BUFFER 的默认值可能是正确的。可以将此参数设置的比默认值更大,但这往往会导致性能下降。如果将其设置的低于默认值,那么将忽略相应的设置。
如果设置了任何控制自动管理的 SGA 组件参数,那么给定的值将作为最小大小(ASSM 不会使组件的内存低于此值)。
自动内存管理
使用自动内存管理(Automatic Memory Management)机制时,通过设置 MEMORY_TARGET 这个参数,就可以让 Oracle 实例从总体上管理服务器内存的使用。这允许 Oracle 根据需要在 PGA 和 SGA 之间转换内存,从而将自动 PGA 管理和自动共享内存管理又向前推了一步。
要启用自动内存管理,设置一个参数 MEMORY_TARGET 参数即可。
MEMORY_TARGET 参数是动态的,可以在不关闭实例的情况下对其进行调整,但其调整不能超过另一个参数 MEMORY_MAX_TARGET 设置的限制。
MEMORY_MAX_TARGET 参数是静态的,要将其调整得更大,只能通过 SCOPE=SPFILE 子句进行调整然后重新启动实例。
如果在启用 AMM 的情况下设置了参数 PGA_AGGREGATE_TARGET 或 SGA_TARGET,那么指定的值将是最小值(AMM 不会使 PGA 或 SGA 低于此值)。
设置内存管理参数
本练习中,将禁用 AMM(如果已启用),并分别设置 SGA 和 PGA 目标。
1. 使用 SQL*Plus,作为用户 SYSTEM 连接数据库。
2. 确保未设置任何用于手工管理动态 SGA 内存结构的参数:

SQL> alter system set shared_pool_size=0 scope=memory;

System altered.

SQL> alter system set db_cache_size=0 scope=memory;

System altered.

SQL> alter system set large_pool_size=0 scope=memory;

System altered.

SQL> alter system set java_pool_size=0 scope=memory;

System altered.

3. 禁用 AMM

SQL> alter system set memory_target=0 scope=memory;

System altered.

4. 分别使用参数来确定 PGA 和 SGA 的大小,使用允许的最小值:

SQL> alter system set pga_aggregate_target=10m scope=memory;

System altered.

SQL> alter system set sga_target=256m scope=memory;

System altered.

第二条命令需要等待几分钟完成,如果 Oracle 无法将 SGA 降低到请求的值,则命令将失败。
5. 通过将所有会话的 session pga memory 统计信息值相加,确定当前分配的 PGA 的实际大小:

SQL> select sum(value) from v$sesstat natural join v$statname
2  where name='session pga memory';

SUM(VALUE)
----------
103937704

此数字远超步骤 4 中要求的 10 MB。其原因在于 10 MB 值过小,Oracle 无法遵循此值。PGA 目标只是目标,并非硬性限制。
6. 确定 SGA 的实际大小

SQL> select sum(bytes) from v$sgastat;

SUM(BYTES)
----------
265618304

此数字同样可能大于步骤 4 中要求的值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  1Z0-053 OCP 11g SGA PGA