ASMM自己主动共享内存管理:
自己主动依据工作量变化调整
最大程度地提高内存利用率
有助于消除内存不足的错误
parameter sga
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------ lock_sga boolean FALSE pre_page_sga boolean FALSE sga_max_size big integer 1G sga_target big integer 1G parameter memoryNAME TYPE VALUE
------------------------------------ ----------- ------------------------------ hi_shared_memory_address integer 0 memory_max_target big integer 0 memory_target big integer 0 shared_memory_address integer 0 parameter pgaNAME TYPE VALUE
------------------------------------ ----------- ------------------------------ pga_aggregate_target big integer 208MASMM 的工作原理 :
ASMM 以 MMON 在后台捕获的工作量信息为基础。
MMON 使用内存指导。
将内存移到 MMAN 最迫切须要的地方。
假设使用 SPFILE:在关闭时保存组件大小 、保存的值用于引导程序组件大小 、无需再确定最佳值
自己主动共享内存管理功能使用由下面两个后台进程实施的 SGA 内存中介:可管理性监视器 (MMON) 和内存管理器 (MMAN)。MMON 定期将统计信息和内存指导数据捕获到内存中。MMAN 依据 MMON 的决定调整内存组件的大小。
SGA 内存中介会不断跟踪组件的大小和待处理的大小调整操作。
SGA 内存中介会观察系统和工作量。以便确定理想的内存分配方案。SGA 内存中介每隔几分钟就运行一次这样的检查,使内存始终用在须要的地方。假设没有自己主动共享内存管理功能,必须分别估计各组件在峰值时的内存需求,然后对其内存大小进行调整。
在工作量信息基础上,自己主动共享内存管理功能会: 定期在后台捕获统计信息使用内存指导
进行如果分析。确定最佳内存分配方案将内存移到最迫切须要的地方
假设使用了 SPFILE。则在关闭时保存组件大小(这些大小能够在最后一次关闭前又一次起用)
启用自己主动共享内存管理功能 :
要从手动共享内存管理模式下启用 ASMM,请运行下面操作:
1.获取 SGA_TARGET 的值:
SELECT ((SELECT SUM(value) FROM V$SGA) - (SELECT CURRENT_SIZE FROM V$SGA_DYNAMIC_FREE_MEMORY)) "SGA_TARGET" FROM DUAL;
2.使用该值设置 SGA_TARGET。
3.将自己主动设置大小的 SGA 组件的值设置为 0。
要从自己主动内存管理模式切换到 ASMM。请运行下面操作:
1.将初始化參数 MEMORY_TARGET 设置为 0。 2.将自己主动设置大小的 SGA 组件的值设置为 0。自己主动优化的 SGA 參数的行为:
未设置 SGA_TARGET 或将其设置为 0 时:自己主动优化的參数指定对应组件的实际大小
、可能须要添加 SHARED_POOL_SIZE SELECT SUM(bytes)/1024/1024 size_mb FROM v$sgastat WHERE pool = 'shared pool'; SGA_TARGET 设置为非零值时: 自己主动优化的參数的默认值为零 、指定的值用作下限大小 SELECT component, current_size/1024/1024 size_mb FROM v$sga_dynamic_components;
手动优化的 SGA 參数的行为:
有些组件不能自己主动优化。--DB_KEEP_CACHE_SIZE 和 DB_RECYCLE_CACHE_SIZE
--非标准块大小的缓冲区快速缓存,DB_nK_CACHE_SIZE
-- LOG_BUFFER 这些组件必须使用数据库參数手动配置。
这些组件使用的内存会降低可用于自己主动优化 SGA 的内存量。
改动 SGA_TARGET 參数 :
--是动态參数 -- 最多可增大到 SGA_MAX_SIZE--能够减小,直到全部组件都达到其下限大小为止
更改 SGA_TARGET 的值仅仅会影响自己主动调整大小的组件
SGA_TARGET 是一个动态參数,能够通过 Database Control 或使用 ALTER SYSTEM 命令更改。
GA_MAX_SIZE 是可分配给 SGA 的内存量的上限。更改该值后。必须又一次启动数据库才干生效。SGA_TARGET 最多可增大到 SGA_MAX_SIZE 值。它能够减小,直到任一自己主动优化的组件达到其下限大小:用户指定的下限值或内部确定的下限值。假设增大 SGA_TARGET 的值。则会依据自己主动优化策略在自己主动优化的组件之间分配添加的那部分内存。
假设减小 SGA_TARGET 的值,则这部分内存将依照自己主动优化策略从一个或多个自己主动优化的组件处提取。
假定 SGA_MAX_SIZE 设置为 10 GB,SGA_TARGET 设置为 8 GB。假设 DB_KEEP_CACHE_SIZE 设置为 1 GB,而且将 SGA_TARGET 增大为 9 GB,则添加的 1 GB 仅仅会在 SGA_TARGET 控制的组件之间进行分配。DB_KEEP_CACHE_SIZE 的值不受影响。相同,假设将 SGA_TARGET 减小到 7 GB。则这 1 GB 也仅仅会从 SGA_TARGET 控制的那些组件中提取。这样的降低并不会影响手动控制的參数(如 DB_KEEP_CACHE_SIZE)的设置。
禁用 ASMM :
将 SGA_TARGET 设置为 0 可禁用自己主动优化功能。
自己主动优化的參数设置为其当前大小。
SGA 大小整体上不受影响。
eg:
SGA_TARGET 的值为 8 GB,SHARED_POOL_SIZE 的值为 1 GB。假设系统将共享池组件的大小内部调整为 2 GB,则将 SGA_TARGET 设置为 0 会导致 SHARED_POOL_SIZE 被设置为 2 GB,从而覆盖用户定义的原始值。
手动调整动态 SGA 參数的大小对于自己主动优化的參数,手动调整大小会:
导致组件大小马上调整(假设新值大于当前值) 、更改下限大小(假设新值小于当前大小)调整手动优化的參数的大小仅仅会影响 SGA 的可调部分。
调整了自己主动优化的參数的大小并设置了 SGA_TARGET 值后,仅仅有当新值大于组件的当前大小时。这样的调整才会导致组件的大小马上发生更改。
比如。假设将 SGA_TARGET 设置为 8 GB,将 SHARED_POOL_SIZE 设置为 2 GB,可确保共享池始终不小于 2 GB。以满足必要的内存分配需求。
之后。即使将 SHARED_POOL_SIZE 值调整为 1 GB,也不会对共享池的大小产生直接影响。仅仅会使自己主动内存优化算法以后能够将共享池大小降低到 1 GB(假设须要)。
相反,假设共享池的大小最初设置为 1 GB,那么将 SHARED_POOL_SIZE 值调整为 2 GB 时,共享池组件的大小会马上添加到 2 GB。
此大小调整操作中使用的内存从一个或多个自己主动优化的组件中提取,手动优化的组件的大小不受影响。
手动调整大小的组件的參数也能够动态变更。但不同之处在于,參数的值会马上指定对应组件的精确大小。因此,假设手动调整的组件的大小增大,则添加的那部分内存将从一个或多个自己主动调整大小的组件处提取。假设手动调整的组件的大小减小。则释放的内存将会提供给自己主动调整大小的组件。
程序全局区 (PGA)
程序全局区 (PGA) 是包括某server进程的数据及控制信息的内存区。这是 Oracle server在server进程启动时创建的非共享内存,仅仅有该server进程才干訪问。
由关联到某个 Oracle 实例的全部server进程分配的 PGA 总内存,也称为该实例分配的聚集 PGA 内存。
使用共享server时,部分 PGA 可位于 SGA 中。
PGA 内存通常包括下面各项:
专用 SQL 区:
专用 SQL 区包括绑定信息和执行时内存结构等数据。这些信息是每一个会话的 SQL 语句调用所特有的。在其他方面,绑定变量有不同的值,游标的状态也不同。发出 SQL 语句的每一个会话都有一个专用 SQL 区。提交同一 SQL 语句的每一个用户也都有其自己的专用 SQL 区,该专用 SQL 区使用一个共享 SQL 区。这样,很多专用 SQL 区可与同一个共享 SQL 区关联。专用 SQL 区的位置取决于为会话建立的连接类型。假设会话是通过专用server连接的。则专用 SQL 区位于该server进程的 PGA 中。只是,假设会话是通过共享server连接的,则部分专用 SQL 区将保留在 SGA 中。
游标和 SQL 区
: Oracle Pro*C 程序或 Oracle OCI 程序的应用程序开发者能够显式打开特定专用 SQL 区的游标或句柄,并在该程序的整个运行过程中将它们用作命名资源。数据库为某些 SQL 语句隐式发出的递归游标也使用共享 SQL 区。工作区
: 对于复杂查询(比如。决策支持查询),会将大部分 PGA 供内存密集型运算符分配的工作区专用,比如: 基于排序的运算符(如 ORDER BY、GROUP BY 和 ROLLUP)和窗体函数 散列联接 位图合并 位图创建 批量装载操作使用的写缓冲区 排序运算符使用工作区(排序区),对一组行运行内存中排序。与此类似,散列联接运算符使用工作区(散列区),依据其左側输入内容生成散列表。 工作区的大小是能够控制和优化的。通常,较大的工作区能够显著改进特定运算符的性能,只是代价是消耗较多的内存。 会话内存 : 会话内存是用于存放会话的变量(登录信息)以及与会话相关的其他信息的内存。对于共享server,会话内存是共享的。而不是专用的。
自己主动 PGA 内存管理
依据 PGA_AGGREGATE_TARGET 參数,动态调整供工作区专用的 PGA 内存量
有助于最大限度地提高全部内存密集型 SQL 操作的性能
默认情况下是启用的
PGA 管理资源 管理 PGA_AGGREGATE_TARGET 初始化參数的统计信息,如 PGA 快速缓存命中百分比能够在下列动态性能视图中查看有关工作区内存分配和使用的统计信息:
V$SYSSTATV$SESSTAT
V$PGASTAT
V$SQL_WORKAREA
V$SQL_WORKAREA_ACTIVE
用于调整 PGA 工作区大小的视图有:
V$PGA_TARGET_ADVICE
V$PGA_TARGET_ADVICE_HISTOGRAM
V$SQL_WORKAREA_HISTOGRAM
-----------------Oracle DB 内存參数
ALTER SYSTEM SET MEMORY_TARGET=300M;
尽管仅须要设置 MEMORY_TARGET 来触发自己主动内存管理,但仍能够为各种快速缓存设置下限值。因此,假设子參数是用户设置的,则这些參数值将是 Oracle DB server自己主动优化该组件时的下限值。
有效使用内存:准则
尽量使 SGA 适合物理内存。
优化以实现高缓冲区快速缓存命中率。但要注意下面几点:
--即使有效且必需的全表扫描也会减少命中率。
--可能存在因不必要地反复读取同一块而出现命中率虚升的情况。
使用内存指导。
库快速缓存的内存优化准则:提高命中率
为开发者制定格式使用约定,以便 SQL 语句符合快速缓存的要求。使用绑定变量。
消除不必要的反复 SQL。
考虑使用 CURSOR_SHARING。
尽可能使用 PL/SQL。
缓存序列号。
连接库快速缓存中的对象。