一、12c:官档
- Books → Performance Tuning Guide → Part III Tuning Database Memory → 11 Database Memory Allocation
二、关于数据库内存缓存和其他内存结构
Oracle数据库将信息存储在内存缓存和磁盘上。内存访问比磁盘访问快得多。与内存访问相比,磁盘访问(物理I/O)占用大量时间,通常为10毫秒。物理I/O还增加了由于设备驱动程序和操作系统事件中调度器的路径长度而需要的CPU资源。出于这个原因,对于经常访问的对象的数据请求,更有效的是由内存执行,而不是要求磁盘访问。适当的规模和有效地使用Oracle数据库内存缓存极大地提高了数据库的性能。影响性能的主要Oracle数据库内存缓存包括:
- Database buffer cache
Database buffer cache 缓存存储从磁盘读取的数据块。 - Redo log buffer
Redo log buffer 存储对缓冲区缓存中数据块所做的更改的重做条目。 - Shared pool
Shared pool 缓存了许多不同类型的数据,主要由以下组件组成:- Library cache
- Data dictionary cache
- Server result cache
- Large pool
Large pool 为以下Oracle数据库特性提供了大量内存分配:- Shared server architecture
- Parallel query
- Recovery Manager (RMAN)
- Java pool
Java pool 特定于会话的Java代码和Java虚拟机(JVM)数据。 - Streams pool
Streams pool 为Oracle流过程提供内存。 - Process-private memory
Process-private memory 包括用于操作的内存,如排序和散列连接。 - In-Memory Column Store (IM column store)
从Oracle Database 12c Release 1(12.1.0.2)开始,IM列存储是一个可选的静态SGA池,它存储表和分区的副本。在IM列存储中,数据以特殊的柱状格式存储,从而提高了操作的性能,如扫描、连接和聚合。
IM列存储并不替代缓冲区缓存,而是作为一个补充,以便两个内存区域可以以不同的格式存储相同的数据。
See Also:
- 《Oracle Database Concepts》有关Oracle数据库内存架构的信息
三、数据库内存管理方法
内存管理的目标是尽可能地减少物理I/O开销,或者通过使所需的数据在内存中更有可能,或者使检索所需数据的过程更有效。为了实现这一目标,必须对Oracle数据库内存缓存进行适当的分级和有效使用。Oracle数据库提供了以下方法来管理数据库内存:
- 自动内存管理(AMM)
- 自动共享内存管理(ASMM)
- 手动共享内存管理
- 自动PGA内存管理
- 手动PGA内存管理
1 自动内存管理(AMM)
自动内存管理使Oracle数据库能够自动管理和调优数据库内存。在自动内存管理模式下,对共享全局区域(SGA)和程序全局区域(实例PGA)内存的管理完全由Oracle数据库处理。这个方法是最自动化的,并且被Oracle强烈推荐。在手动设置内存池大小之前,强烈考虑使用自动内存管理。有关使用自动内存管理的信息,请参见“使用自动内存管理”。
2 自动共享内存管理(ASMM)
如果自动内存管理被禁用,那么Oracle数据库使用自动共享内存管理来管理SGA内存。在这种模式下,Oracle数据库根据您为SGA内存总量设置的目标大小,自动将内存分配给单个SGA组件。有关使用自动共享内存管理的信息,请参见“使用自动共享内存管理”。
3 手动共享内存管理
如果禁用了自动内存管理和自动共享内存管理,那么您必须通过在SGA中调整单个内存池来手动管理SGA内存。尽管这种模式使您能够完全控制SGA内存如何分布,但它需要最大的努力,因为SGA组件必须手动地进行调整。有关使用手动共享内存管理的信息,请参阅“手动调整SGA组件的大小”。
4 自动PGA内存管理
如果自动内存管理被禁用,那么Oracle数据库将使用自动PGA内存管理来管理PGA内存。在这种模式下,Oracle数据库根据您为总PGA内存设置的目标大小自动将内存分配到实例PGA中的工作区域。有关自动PGA内存管理的信息,请参见优化程序全局区域。
5 手动PGA内存管理
如果自动内存管理和自动PGA内存管理都被禁用,那么您必须通过调整PGA内存的部分来手动管理PGA内存。这种方法可能非常困难,因为工作负载总是在变化,而Oracle不推荐这种方法。尽管Oracle数据库支持手动PGA内存管理,但Oracle强烈建议使用自动内存管理或自动PGA内存管理。四、使用AMM
要使用自动内存管理,请设置以下初始化参数:- MEMORY_TARGET
MEMORY_TARGET初始化参数指定目标内存大小。数据库调到该参数指定的值,在SGA和实例PGA之间需要重新分配内存。该参数是动态的,因此它的值可以在任何时候更改,而无需重新启动数据库。 - MEMORY_MAX_TARGET
MEMORY_MAX_TARGET初始化参数指定最大内存大小。该参数指定的值作为MEMORY_TARGET初始化参数设置的限制。该参数是静态的,因此在实例启动后它的值不能更改。
See Also:
- 《Oracle Database Administrator's Guide》有关使用自动内存管理的信息
五、监控内存管理
表 1:列出提供关于内存调整操作的信息的视图。
视图 | 描述 |
---|---|
V$MEMORY_CURRENT_RESIZE_OPS | 显示当前正在进行的内存调整操作(自动和手动)的信息。 |
V$MEMORY_DYNAMIC_COMPONENTS | 显示所有动态调整内存组件的当前大小的信息,包括SGA和实例PGA的总大小。 |
V$MEMORY_RESIZE_OPS | 显示有关最后800个已完成内存大小的操作(自动和手动)的信息。这并不包括当前正在进行的操作。 |
V$MEMORY_TARGET_ADVICE | 为MEMORY_TARGET初始化参数显示优化建议。 |
- 《Oracle Database Reference》有关这些视图的更多信息