【基础篇内存结构】oracle10g内存结构(一)

Oracle的内存是与实例对应的,一个实例就有一个独立的内存结构,Oracle的内存中主要存储以下信息:

1,oracle的程序代码以及程序执行所需的信息

2,数据缓存

3,会话信息以及进程间通信的信息(如锁)

Oracle的基本内存结构包括:

Sga(system global area),此区域由所有的服务进程和后台进程共享

Pga(program global area),此区域是每个服务进程和后台进程所似有,即每个进程都有一个属于自己的pga

可以用下表示意:

 

SGA

 

Share pool

Buffer cache

Redo log buffer

Java pool

Stream pool(10g)

Large pool

Fixed SGA

Keep buffer cache

User define buffer

 

PGA(*n)

 

Bitmap merge area

Sort area

Hash area

 

 

Sga包含

数据缓存区(database buffer cache)

重做日志缓冲区(redo log buffer)

共享池(shared pool)

Java(java pool)

大池(large pool)

数据流池(streams pool)

数据字典缓存区(data dictionary cache)

其他信息(如数据库和实例的状态信息)

 

当实例启动时系统即分配sga。例如:

SQL> startup nomount;

ORACLE instance started.

 

Total System Global Area  591396864 bytes

Fixed Size                  1268800 bytes

Variable Size             322962368 bytes

Database Buffers          260046848 bytes

Redo Buffers                7118848 bytes

SQL>

可以通过一些参数来设置sga,这些参数影响系统的整体性能。

SGA_MAX_SIZESGA_TARGET

SQL> show parameters SGA

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

lock_sga                             boolean     FALSE

pre_page_sga                         boolean     FALSE

sga_max_size                         big integer 564M

sga_target                           big integer 564M

SQL>

也可以通过v$sga系统视图来查看对应的值:

SQL> select * from  v$sga;

 

NAME                      VALUE

-------------------- ----------

Fixed Size              1268800

Variable Size         322962368

Database Buffers      260046848

Redo Buffers            7118848

 

在前面的sga相关参数中还有两个分别是lock_sgapre_page_sgapre_page_sga默认设置为false,实例启动时不必将sga全部分配物理内存,设置为true则是全部分配,当lock_sga设置为true时,锁定sga在物理内存中,不允许换入和换出。

 

SGA_TARGET

当设置了SGA_TARGET参数时,数据库自动启动了ASMM(自动内存管理),oracle将代替人工来控制sga中的buffer poolshared pool等区域的大小,随时调节以将系统性能最大化和最合理化。Sga_target的值总是小于或等于sga_max_size。不能指定大于sga_max_sizesga_target,例如:

SQL> alter system set sga_target=600M;

alter system set sga_target=600M

*

ERROR at line 1:

ORA-02097: parameter cannot be modified because specified value is invalid

ORA-00823: Specified value of sga_target greater than sga_max_size

 

当指定SGA_TARGET小于SGA_MAX_SIZE,实例重启后,SGA_MAX_SIZE就自动变为和SGA_TARGET一样的值了。但可以将sga_max_size设置的稍大,在启动实例的时候可以动态的设置sga_target的值:

SQL> alter system set sga_target=500M;

 

System altered.

 

SQL> show parameters SGA;

 

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

lock_sga                             boolean     FALSE

pre_page_sga                         boolean     FALSE

sga_max_size                         big integer 564M

sga_target                           big integer 500M

SQL> alter system set sga_target=564M;

 

System altered.

 

SQL>

 

如果sga_target=0sga的容量由多个初始化参数决定,主要有:

DB_CACHE_SIZE 标准容量数据块使用的缓存区的容量

LOG_BUFFER 重做日志缓冲区的容量,以字节为单位

SHARED_POOL_SIZE 存储共享SQLPLSQL的内存容量,以字节为单位

LARGE_POOL_SIZE 大池容量,默认为0

JAVA_POOL_SIZE java池的容量

DB_nK_CACHE_SIZE 非标准容量数据块使用的缓存区

DB_KEEP_CACHE_SIZE 保留缓存区

DB_RECYCLE_CACHE_SIZE 回收缓存区

这些参数可以使用alter system来调整

 

可以通过v$sgastat视图来查看sga的相关统计信息,这个视图记录了各个池的内存分配情况,例如:

SQL> desc v$sgastat;

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 POOL                                               VARCHAR2(12)

 NAME                                               VARCHAR2(26)

 BYTES                                              NUMBER

 

SQL> select pool,sum(bytes) from v$sgastat group by grouping sets (pool,());

 

POOL         SUM(BYTES)

------------ ----------

java pool       4194304

large pool      4194304

shared pool   314577492

            268434496

            591400596

 

SQL> select * from v$sgastat where rownum <10;

 

POOL         NAME                            BYTES

------------ -------------------------- ----------

             fixed_sga                     1268800

             buffer_cache                260046848

             log_buffer                    7118848

shared pool  KGX                            105012

shared pool  call                            22048

shared pool  list                             3584

shared pool  dummy                            9468

shared pool  kfmsg                            3088

shared pool  kksss                            3072

 

9 rows selected.

 

视图V$SGA_DYNAMIC_FREE_MEMORY记录当前sga可用于动态调整sga内存区的空闲区域大小。由于设置的sga_target=0,因此值为0

SQL> select * from V$SGA_DYNAMIC_FREE_MEMORY a;

 

CURRENT_SIZE

------------

           0

 

SQL>

 

数据库缓冲

10g使用db_cache_size来设置buffer cache的大小

oracle用户进程第一次访问一个数据块时,会先查找buffer cache中是否存在这个数据块的拷贝,如果已经存在(命中),他就直接从内存中读取数据块,如果未命中,则需要先从数据文件中读取该数据块到buffer cache中,然后再访问该数据块。

通常可以用下列代码来查看实例启动到目前为止的命中率情况:

SQL> select 1 - (sum(decode(name, 'physical reads', value, 0)) /

  2         (sum(decode(name, 'db block gets', value, 0)) +

  3         (sum(decode(name, 'consistent gets', value, 0))))) "Buffer Hit Ratio"

  4    from v$sysstat;

 

Buffer Hit Ratio

----------------

      .932341968

 

SQL>

Oracle 对于 buffer cache 的管理是通过两个重要的链表实现的:写链表和最近最少使用链表 (the least recently used LRU)

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16179598/viewspace-665999/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16179598/viewspace-665999/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值