Oracle内存管理(之四)

【深入解析--eygle】学习笔记

1.3 SGA管理

SGA指系统全局区(System Global Area),是一块用于加载数据、对象并保存运行状态和数据库控制信息的一块内存区域,在数据库实例启动时分配,当实例关闭时释放,每个实例都拥有自己的SGA区。

在第一章曾经?到,当数据库启动到nomount状态时,SGA已经分配,同时启动后台进程,在SQL*Plus中通过show
sga命令可以看到SGA的分配情况:

[email protected] SQL>show parameter sga

NAME                                 TYPE                   VALUE
---------------------------------------------------------- ------------------------------
lock_sga                             boolean                FALSE
pre_page_sga                         boolean                FALSE
sga_max_size                         big integer            400M
sga_target                           big integer            0
16:12:56 [email protected] SQL>
 

连接到Oracle数据库的用户都可以共享SGA中的数据,通常为了更优化的性能,我们总是期望在物理内存允许的情况下,设置更高的SGA区,以减少物理I/O(SGA中数据缓冲区的增大可以有效地减少物理读)。

1.4 SGA

下图是最常见的数据库实例体系结构图,展现了SGA的结构:

1.4.1  固定区域  - Fixed Area

Fixed  Size  部分是SGA中的固定部分,包含几千个变量和一些小的数据结构,如Latch或地址指针等,这部分内存分配和特定的数据库版本以及平台有关,不受用户控制,而且这些信息对于数据库来说非常重要,但是通常我们用户不需要关心。

固定部分只需要很小的内存,可以通过一个内部表X$KSMFSV([K]ernel [S]ervice Layer , [M]emoryManagement,Addresses of [F]ixed [S]GA [V]ariables)查询。此外Oracle的内部表X$KSMMEM记录了整个SGA的地址映射关系,通过X$KSMFSV和X$KSMMEM关联,可以找出Fixed Area中每个变量的设置。

在32位平台上,X$KSMMEM表中每条记录代表4  Bytes,在64位平台,每条记录代表4 Bytes:

[email protected] SQL>select * from x$ksmmem whererownum <5;

ADDR                   INDX    INST_ID KSMMMVAL
---------------- ---------- --------------------------
0000000060000000          0          1 00
0000000060000008          1          1 00
0000000060000010          2          1 00
0000000060000018          3          1 00

16:21:39 [email protected] SQL>
[email protected] SQL>select ksmfsnam,ksmfssiz from x$ksmfsv where ksmfsnam='kcsgscn_';

KSMFSNAM           KSMFSSIZ
-----------------  --------
kcsgscn_                 48

16:23:51 [email protected] SQL>

通过ORADEBUG工具可以得到当前内存中的SCN值:

16:23:51 [email protected] SQL>oradebug setmypid
Statement processed.
16:26:19 [email protected] SQL>oradebug DUMPvar SGA kcsgscn_
kcslf kcsgscn_ [060019598, 0600195C8) = 00183004 00000000 00000000 00000000 000024AE 00000000 00000000 00000000 00000000 00000000 60019278 00000000
16:26:22 [email protected] SQL>

SCN值获取如下:

[email protected] SQL>selectto_number('183004','xxxxxxxxxx') from dual;

TO_NUMBER('183004','XXXXXXXXXX')
--------------------------------
                         1585156

16:27:05 [email protected] SQL>

Fixed Area包含很多控制信息,但是需要注意的是,查询X$KSMFSV视图可能会导致进程异常,需要谨慎使用

1.4.1.1 Buffer Cache

Buffer Cache-缓冲区高速缓存,用于存储最近使用的数据块,这些数据块可能是被修改过的,也可能是未经修改的。我们知道,在Oracle对数据的处理过程中,代价最昂贵的就是物理I/O(Physical  I/O)操作了,同样的数据从内存中得到要比从磁盘上读取快得多,所以将尽可能多的数据保存在内存中,可以减少磁盘I/O操作,从而提高数据库的性能。

从Oracle9i开始,Oracle引入了一个新的初始化参数db_cache_size  ,该参数用来定义主Block Size(db_block_size定义的块大小)的Default缓冲池的大小

各内存组件所使用的Granule大小可以通过动态性能视图来查询:

16:36:00 [email protected] SQL>select component,granule_size from v$sga_dynamic_components;

COMPONENT                         GRANULE_SIZE
--------------------------------- ------------
shared pool                            4194304
large pool                             4194304
java pool                              4194304
streams pool                           4194304
DEFAULT buffer cache                   4194304
KEEP buffer cache                      4194304
RECYCLE buffer cache                   4194304
DEFAULT 2K buffer cache                4194304
DEFAULT 4K buffer cache                4194304
DEFAULT 8K buffer cache                4194304
DEFAULT 16K buffer cache               4194304
DEFAULT 32K buffer cache               4194304
Shared IO Pool                         4194304
ASM Buffer Cache                       4194304

14 rows selected.

17:33:14 [email protected] SQL>

Oracle管理Buffer  Cache使用的是LRU算法,但是这又带来另外一个问题,很多批处理的操作(比如全表扫?等)可能会导致Buffer
Cache的刷新,将经常使用的数据“挤出”Buffer Cache,在不同版本中,Oracle不停的改进LRU算法,以避免这类操作的过度影响。

但是在此之外,Oracle提供了BufferCache的多缓冲池技术从另外一个方面来解决这个问题。所谓的多缓冲池技术是指,根据不同数据的不同访问方式,将Buffer Cache分为Default、Keep和Recycle池三个部分。对于经常使用的数据,我们可以在建表时就指定将其存放在Keep池中;对于经常一次性读取使用的数据,可以将其存放在Recycle池中;Keep池中的数据倾向于一直保存,Recycle池中的数据倾向于即时老化,而Default池则存放未指定存储池的数据,按照LRU算法管理。

默认情况下,所有表都使用DEFAULT池,它的大小就是数据缓冲区Buffer Cache的大小,由初始化参数db_cache_size(8i中是db_block_size*db_block_buffers)决定。

17:33:14 [email protected] SQL>show parameter db_cache_size

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
db_cache_size                        big integer            0
17:37:24 [email protected] SQL>

如果我们在创建数据表或修改数据表时指定STORAGE  (BUFFER_POOL KEEP)或者STROAGE(BUFFER_POOL  RECYCLE)语句,就设置了这张表使用KEEP或者RECYCLE缓冲区。这两个缓冲区的大小分别由初始化参数db_keep_cache_size和db_recycle_cache_size来决定。

17:39:03 [email protected] SQL>show  parameter  db_keep_cache_size

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
db_keep_cache_size                   big integer            0

Property


Description


Parameter type


Big integer


Syntax


DB_KEEP_CACHE_SIZE = integer [K | M | G]


Default value


0 (DB_KEEP_CACHE_SIZE is not configured by default)


Modifiable


ALTER SYSTEM


Range of values


Minimum: 0 (values greater than zero are automatically modified to be either the granule size * number of processor groups, or 4 MB * number of CPUs, whichever is greater)

Maximum: operating system-dependent


Basic


No

DB_KEEP_CACHE_SIZE specifiesthe size of the KEEP bufferpool. The size of the buffers in the KEEP buffer
pool is the primary blocksize (the block size defined by the DB_BLOCK_SIZE initialization parameter).

17:39:24 [email protected] SQL>show parameter  db_recycle_cache_size

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
db_recycle_cache_size                big integer            0
17:39:42 [email protected] SQL>

Property


Description


Parameter type


Big integer


Syntax


DB_RECYCLE_CACHE_SIZE = integer [K | M | G]


Default value


0 (DB_RECYCLE_CACHE_SIZE is not configured by default)


Modifiable


ALTER SYSTEM


Range of values


Minimum: 0 (values greater than zero are automatically modified to be either the granule size * number of processor groups, or 4 MB * number of CPUs, whichever is greater)

Maximum: operating system-dependent


Basic


No

DB_RECYCLE_CACHE_SIZE specifiesthe size of the RECYCLE bufferpool. The size of the buffers in the RECYCLE pool
is the primary block size(the block size defined by the DB_BLOCK_SIZE initialization parameter).

17:39:42 [email protected] SQL>show parameter cache_size

NAME                                 TYPE                   VALUE
---------------------------------------------------------- ------------------------------
client_result_cache_size             big integer            0
db_16k_cache_size                    big integer            0
db_2k_cache_size                     big integer            0
db_32k_cache_size                    big integer            0
db_4k_cache_size                     big integer            0
db_8k_cache_size                     big integer            0
db_cache_size                        big integer            0
db_flash_cache_size                  big integer            0
db_keep_cache_size                   big integer            0
db_recycle_cache_size                big integer            0

同时还可以看到,在Oracle9i以后存在一系列的db_nk_cache_size参数,这是Oracle9i中引入的多块大小支持。Oracle9i以后允许在同一个数据库中存在多种Block_size的表空间,分别支持:
2k,4k,8k,16k和32k 的Block_size,其中,由db_block_size定义的块大小被称为主Block_size。如果在数据库中创建不同block_size的表空间则需要分别设定db_nk_cache_size参数。

各缓冲池的设置,我们可以通过查询v$buffer_pool得到:

17:43:03 [email protected] SQL>select id,name,block_size,current_size,target_size from v$buffer_pool;

        ID NAME                                     BLOCK_SIZE CURRENT_SIZE TARGET_SIZE
---------- ---------------------------------------- ---------- ------------ -----------
         3 DEFAULT                                        8192           72          72

17:46:03 [email protected] SQL>

1.4.1.2 Shared Pool

Shared  Pool通常被称为共享池,包含共享内存结构,如SQL区等。SQL区包含SQL解

析树、执行计划等信息,通过共享池,反复执行的SQL可以在不同Session间得到共享。

1.4.1.3 Redo Log Buffer

Redo  Log Buffer-日志缓冲区存储重做日志条目(redo  entries),日志记录数据库变更,最终将被写出到重做日志文件中,在数据库崩溃或故障时用于恢复;如果 数 据 库 运 行 在 归 档 模 式下,最终日志文件还会被写出到归档日志中,这些归档可以在介质恢复时用于进行数据恢复。

日志缓冲区的大小由初始化参数log_buffer决定。这是一个静态参数,不能动态调整。

Oracle内存管理(之四),布布扣,bubuko.com

时间: 2024-10-18 00:28:26

Oracle内存管理(之四)的相关文章

Oracle内存管理(之五)

[深入解析--eygle]学习笔记 1.4. 2其他内存组件 Large Pool-大池是SGA的一个可选组件,通常用于共享服务器模式(MTS). 并行计算或 RMAN的备份恢复等操作. Java Pool-Java池主要用于JVM等Java选件. Streams Pool-Streams pool是Oracle10g引入的概念,为Oracle的Streams功能所使用,如果不定义该参数,这部分内存将从Shread Pool中分配 对于SGA各部分内存分配,可以从数据库的视图中查询得到: 17:

黑马程序员----内存管理之四——《autorelease自动释放池》

内存管理之四——autorelease自动释放池 1.autorelease的基本使用 此对象方法会将对象放到一个自动释放池内: 当自动释放池被销毁时,就会对池子内的所有对象做一次release操作: 此方法会返回对象本身: 调用完此方法后,对象计数器的值不变,只有到自动释放池被销毁时才会对对象做一次release操作: 2.autorelease的好处 不用在关心对象被销毁的时间: 不用关心什么时候调用release操作: 3.autorelease的使用注意 占用内存较大的对象不要随便使用a

Oracle内存管理(之二)

[深入解析--eygle] 学习笔记 1.2.2 UGA和CGA UGA(用户全局区)由用户会话数据.游标状态和索引区组成.在共享服务器模式下,一个共享服务进程被多个用户进程共享,此时UGA是Shared Pool或Large Pool的一部分,而在专用服务器模式下,UGA则是PGA的一部分. 不考虑Shared  Server模式,在Dedicated模式下,PGA与UGA关系,就如同Process和Session的关系,PGA是服务于进程的内存结构,包含进程信息:而UGA是服务于会话的,它包

oracle内存管理

参考文章 参考文章 参考文章 参考文章 参考文章 oracle内存管理,布布扣,bubuko.com

Oracle 内存管理

--内存分配建库时可以先分配系统内存的50%-80%给Oracle,后期根据业务再进行调整.SGA.PGA分配比例:OLTP:SGA %80 , PGA %20OLAP:SGA %50 , PGA %50混合:SGA %60 , PGA %40 --sga自动管理statistics_level 值设置为 typical 或 all,启动 sga 自动管理.给定 sga_target 一个总的数值. --sga手动管理设置 sga_target=0 ,设置相关组件大小:java_pool_siz

【读书笔记】ORACLE 内存管理

<Administrator's Guide>第6章介绍了ORACLE实例的内存管理,在11g中,ORACLE默认使用自动内存管理(AMM)来管理SGA和PGA的大小.除了默认的方法之外,还可以使用自动共享内存管理SGA(ASMM).手动共享内存管理SGA.自动PGA内存管理.手动PGA内存管理. 一.自动内存管理 自动内存管理是最方便的内存管理方式,只需要设定参数MEMORY_TARGET的值,ORACLE 就会根据实际需要分配SGA和PGA. 1.1应用自动内存管理 1.用SYSDBA的身

Oracle 11G R2的内存管理

基本知识点 基本的内存结构:SGA+PGA+UGA+Software code area(软件代码区) 了解SGA内存的组件与一些常用的功能 了解oracle 11G地自动内存管理功能 具体介绍 oracle数据库实例是由一些列的系统全局区域与后台进程组成. 一个客户端访问数据库的方式是客户端进程---->Program global are----->Database buffer cache,同时在Redo log buffer重写一份 oracle 内存管理的方式:自动内存管理与手动内存

Oracle内存管理理论篇二

目标 了解oracle内存管理方式 掌握ASMM管理方式 掌握AMM管理方式 监控内存使用 学习一个知识点时,最好先了解其历史.ORACLE近期的版本都对内存管理做了简化,从9i通过PGA_AGGREGATE_TARGET参数实现PGA的自动管理,10g通过Automatic Shared Memory Management(ASMM)实现SGA的自动管理,到11g通过Automatic Memory Management(AMM)实现内存(SGA+PGA)的自动管理.目前的11G版本,DBA只

ORACLE内存结构简介

ORACLE数据库作为世界上一款功能强大的数据库管理软件,功能体系特别庞大.我们有必要对它的每一部分学习了解,然后才从全局的角度进行有效把握.我们会着重从理论基础体系角度再逐步到实战应用.实际上,如果没有掌握基础理论体系,而直接生搬硬套一些维护技术经验,那也只是空中楼阁罢了.而如果你想直接通过一两篇文章学到什么秘籍成为维护或是DB优化高手那也是不现实的.所以这些文适合静下心来真正想了解学习ORALCE体系的读者.方法论掌握好,起码头脑中的思路方向是正确的,至于术也就是水到渠成. 我们通常所说的O