一、12c:官档
- Books → Performance Tuning Guide → Part III Tuning Database Memory → 12 Tuning the System Global Area
二、使用ASMM
ASMM 简化了SGA的配置,通过在SGA中自动分配内存,用于以下内存池:
- Database buffer cache (default pool)
- Shared pool
- Large pool
- Java pool
- Streams pool
ASMM 由 SGA_TARGET 参数控制。SGA_TARGET 参数的值的变化会自动调整这些内存池的大小。如果将这些内存池设置为非零值,则 ASMM 将这些值作为最小值。Oracle建议您根据应用程序组件需要正常运行的最小内存数量设置最小值。
以下内存缓存是手动大小的组件,不受自动共享内存管理控制:
- Redo log buffer
redo log buffer 使用 LOG_BUFFER 初始化参数,如“Configuring the Redo Log Buffer”中所描述的。 - 其它 buffer caches (例如 KEEP, RECYCLE 和其它非默认块大小 )
KEEP pool 的大小使用DB_KEEP_CACHE_SIZE初始化参数,如“Configuring the KEEP Pool”中所描述的那样。
RECYCLE pool的大小使用db_restcle_cache_size初始化参数,如“Configuring the RECYCLE Pool”中所描述的那样。 - Fixed SGA 和其他内部分配
Fixed SGA 和其他内部分配使用DB_nK_CACHE_SIZE初始化参数。
以下部分描述了如何访问和设置SGA_TARGET参数的值:
- 设置 SGA_TARGET 参数的用户界面。
- 设置 SGA_TARGET 参数
- 《Oracle Database Concepts》关于SGA的信息。
- 《Oracle Database Administrator's Guide》关于管理 SGA 的信息
- 《Oracle Database Administrator's Guide》关于使用初始化参数的信息
1 设置SGA_TARGET参数的用户界面
本节描述用于设置SGA_TARGET参数值的用户界面。
1.1 在 Oracle Enterprise Manager Cloud Control 中设置SGA_TARGET参数。
您可以通过访问内存参数SGA页面中的SGA Size Advisor来更改Oracle Enterprise Manager Cloud Control (Cloud Control)中SGA_TARGET参数的值。
1.2 在命令行界面中设置SGA_TARGET参数
您可以通过查询 V$SGA_TARGET_ADVICE 视图和使用 ALTER SYSTEM 命令来更改命令行界面中 SGA_TARGET 参数的值。
2 设置 SGA_TARGET 参数
本节描述如何通过设置SGA_TARGET参数的值来启用和禁用自动共享内存管理。
2.1 启用 ASMM
要启用ASMM,请设置以下初始化参数:
- STATISTICS_LEVEL 设置 TYPICAL 或 ALL
- SGA_TARGET 设置一个非零值
SGA_TARGET参数可以设置为小于或等于SGA_MAX_SIZE初始化参数值的值。将SGA_TARGET参数的值设置为您打算将其用于SGA的内存数量。
2.2 禁用 ASMM
为了禁用 ASMM,在实例启动时将SGA_TARGET参数的值动态设置为0。
这种禁用的 ASMM 和当前的自动调整大小将用于每个内存池。如有必要,可以手动调整每个内存池的大小,如“Sizing the SGA Components Manually”。三、手动调整SGA组件的大小
如果系统没有使用 AMM 或 ASMM,那么您必须手动配置以下 SGA 组件的大小:
- Database buffer cache
数据库缓冲区缓存的大小使用DB_CACHE_SIZE初始化参数,如“Configuring the Database Buffer Cache”中所描述的那样。 - Shared pool
共享池的大小使用SHARED_POOL_SIZE初始化参数,如“Configuring the Shared Pool”中所描述的那样。 - Large pool
大型池的大小使用LARGE_POOL_SIZE初始化参数,如“Configuring the Large Pool”中所描述的那样。 - Java pool
Java池的大小使用JAVA_POOL_SIZE初始化参数。 - Streams pool
流池的大小使用STREAMS_POOL_SIZE初始化参数。 - IM column store
IM列存储的大小使用INMEMORY_SIZE初始化参数。
在配置这些SGA组件的大小之前,请考虑以下因素:
- SGA大小单位
- SGA的最大尺寸
- 应用注意事项
- 操作系统内存使用
- 迭代过程中配置
- 《Oracle Database Java Developer's Guide》有关Java内存使用和JAVA_POOL_SIZE初始化参数的信息。
- 《Oracle Streams Replication Administrator's Guide》有关STREAMS_POOL_SIZE初始化参数的信息。
- 《Oracle Database In-Memory Guide》有关INMEMORY_SIZE初始化参数的信息。
1 SGA 大小单元
buffer cache、shared pool、large pool 和 Java pool 的内存分配在颗粒单元中。如果SGA大小小于1GB,则颗粒大小为4MB。如果SGA大小大于1 GB,则颗粒大小变化为16MB。当数据库实例启动时,计算并修复颗粒大小。在实例的生命周期中,大小不会改变。
要查看当前用于SGA的颗粒大小,请使用V$SGA_DYNAMIC_COMPONENTS视图。SGA中的所有动态组件都使用相同的颗粒大小。2 SGA 的最大值
实例启动时,数据库实例可用的最大内存数量取决于SGA_MAX_SIZE初始化参数的值。您可以将总SGA大小扩展到与SGA_MAX_SIZE参数相同的值。SGA_MAX_SIZE参数的值默认为所有SGA组件的聚合设置。
如果不设置SGA_MAX_SIZE参数的值,则减小一个缓存的大小,并在必要时将该内存重新分配给另一个缓存。或者,您可以将SGA_MAX_SIZE参数的值设置为大于所有SGA组件的总和,例如 buffer cache 和 shared pool。这样做使您能够动态地增加缓存大小,而不必减少另一个缓存的大小。
Note:不能动态调整SGA_MAX_SIZE参数的值。
3 应用注意事项
在配置内存时,内存缓存大小是根据应用程序的需要的。相反,调优应用程序对内存缓存的使用可以极大地减少资源需求。有效地使用内存缓存也减少了相关资源的负载,比如锁存器、CPU和I/O系统。
为了获得最佳性能,请考虑以下因素:- 设计缓存以最有效的方式使用操作系统和数据库资源。
- 将内存分配给Oracle数据库内存结构,以最好地反映应用程序的需求。
- 如果对现有应用程序进行了更改或添加,可以调整Oracle数据库内存结构,以满足修改后的应用程序的需要。
- 如果应用程序使用Java,则研究是否需要修改Java池的默认配置。
See Also:
- 《Oracle Database Java Developer's Guide》有关Java内存使用情况的信息。
4 操作系统内存使用
对于大多数操作系统,在配置内存时考虑以下事项非常重要:
- 减少分页
- 将SGA放入主存储器中
- 允许对个人用户有足够的内存
- 您的操作系统硬件和软件文档,以及特定于您的操作系统的Oracle文档,以获得关于优化操作系统内存使用的更多信息。
4.1 减少分页
当操作系统将内存驻留页面传输到磁盘时,仅将新页加载到内存中,就会发生分页。许多操作系统页面可以容纳大量不符合实际内存的信息。在大多数操作系统上,分页会降低性能。
要确定是否在主机系统上发生了重大的分页,请使用操作系统实用程序来检查操作系统。如果发生了显著的分页,那么整个系统内存可能不够大,无法容纳分配内存的内存缓存。考虑增加系统的总内存,或者减少分配的内存。
4.2 将SGA放入主存储器中
由于SGA的目的是在内存中存储用于快速访问的数据,SGA应该驻留在主内存中。如果将SGA的页面交换到磁盘,那么数据就不再能够快速访问。在大多数操作系统中,分页的缺点大大超过了大型SGA的优点。
4.2.1 查看SGA内存分配
要查看分配给SGA和每个内部结构的内存大小,请使用SQL*Plus中的SHOW SGA语句,如下例所示:
SQL> SHOW SGA
该语句的输出可能如下所示:
Total System Global Area 840205000 bytes
Fixed Size 279240 bytes
Variable Size 520093696 bytes
Database Buffers 318767104 bytes
Redo Buffers 1064960 bytes
4.2.2 将SGA锁定为物理内存
为了防止SGA被分页,可以考虑通过启用LOCK_SGA参数将SGA锁定到物理内存中。当启用LOCK_SGA参数时,数据库不使用MEMORY_TARGET和MEMORY_MAX_TARGET参数。
4.3 允许对个人用户有足够的内存
在设置SGA时,请确保您为单个服务器进程和系统上运行的任何其他程序留有足够的内存。
5 迭代过程中配置
配置内存分配需要根据应用程序的需要将可用内存分发给Oracle数据库内存结构。Oracle数据库结构的内存分布方式可以影响Oracle数据库正常运行所需的物理I/O数量。拥有一个适当的初始内存配置可以说明I/O系统是否被配置有效。
在初始化参数通过内存配置过程之后,可能需要重复内存分配的步骤。后续的通过使您可以根据后续步骤的更改,对前面的步骤进行调整。例如,减小缓冲区缓存的大小使您能够增加另一个内存结构的大小,比如共享池。四、监测共享内存管理
表 1 列出了提供关于SGA大小调整操作的信息的视图。
视图 | 描述 |
---|---|
V$SGA_CURRENT_RESIZE_OPS | 显示当前正在进行的SGA调整操作的信息。 |
V$SGA_RESIZE_OPS | 显示有关最后800个已完成的SGA调整操作的信息。这并不包括当前正在进行的操作。 |
V$SGA_DYNAMIC_COMPONENTS | 显示SGA中动态组件的信息。此视图汇总了所有已完成的SGA调整操作的信息,这些操作是在实例启动之后发生的。 |
V$SGA_DYNAMIC_FREE_MEMORY | 显示有关未来动态SGA调整操作的SGA内存数量的信息。 |
See Also:
- 《Oracle Database Reference》了解关于这些视图的信息
五、使用In-Memory列存储提高查询性能
In-Memory 的列存储(IM列存储)是系统全局区域(SGA)的可选部分,它以柱状格式存储表、分区和其他数据库对象的副本,并对这个柱状数据进行优化,以进行快速扫描。当IM列存储在内存中存储数据库对象时,Oracle数据库可以执行扫描、查询、连接和聚合,这些数据比在存储在磁盘上的数据执行这些操作要快得多。Note:
- IM列存储和数据库缓冲区缓存存储相同的数据,但格式不同。IM列存储并不替代数据库缓冲区缓存中的基于行的存储,而是为实现更好的查询性能而进行补充。
- IM列存储可以从Oracle数据库12c发布1(12.1.0.2)开始。
- 《Oracle Database In-Memory Guide》有关IM列存储的更多信息