内存存储的主要内容:
程序代码;
已经连接的会话信息,包括当前所有活动和非活动会话;
程序运行时必须的相关信息
oracle进程之间共享的信息和相互交流的信息
永久存储在外围存储介质上,被cache在内存中的数据
SGA
是一组为系统分配的共享的内存结构。
包括以下数据结构:
数据缓冲(Buffer Cache)
重做日志缓冲(Redo Log Buffer)
共享池(Shared Pool)
java池(Java Pool)
大池(Large Pool)
流池(Streams Pool)10g以后才有
数据字典缓存(Data Dictionary Cache)
其他信息
SQL> show sga
Total System Global Area 2147483648 bytes
Fixed Size 2085360 bytes
Variable Size 1241517584 bytes
Database Buffers 889192448 bytes
Redo Buffers 14688256 bytes
数据字典缓存和其他信息会被实例的后台进程所访问,它们在实例启动后就固定在SGA中了,而且不会改变,所有这部分又称为固定SGA(Fixed SGA)。这部分区域的大小一般小于100K。
Shared Pool,Java Pool,Large Pool和Streams Pool这几块内存区的大小是相应系统参数设置而改变的,所以可以统称为可变SGA(Variable SGA)。
SQL> show parameter sga
NAME TYPE VALUE
------------------------------------ --------------- ------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 2G
sga_target big integer 2G
SQL> select NAME,VALUE,ISSES_MODIFIABLE,ISSYS_MODIFIABLE from v$parameter where NAME like 'sga%';
NAME VALUE ISSES_MODIFIABL ISSYS_MODIFIABLE
-------------------- -------------------- --------------- --------------------
sga_max_size 2147483648 FALSE FALSE
sga_target 2147483648 FALSE IMMEDIATE
如果ISSYS_MODIFIABLE返回的是false,说明该参数无法用alter system语句动态修改,需要重启数据库。
所以sga_max_size是不可以动态修改的。
相关参数说明
sga_max_size
控制SGA使用虚拟内存的最大大小
当实例启动后,各个内存区只分配实例所需要的最小大小,在随后的运行过程中,再根据需要扩展他们的大小,而他们的综合大小受到了sga_max_size的限制。如果在设置参数时,指定区域为spfile时,是不会受到这个限制的。
pre_page_sga
如果为true,实例一启动后,所有SGA都分配到物理内存。
lock_sga
为true时,可将全部SGA都锁定在物理内存中。
sga_target
10g之前,SGA的各个内存区在分配之后,只能给本区使用,相互之间是不能共享的。10g的新特性,自动共享内存管理(Automatic Shared Memory Management ASMM)。 控制这一特性的,就是sga_target。一旦给sga_target指定值后(默认为0,即没有启动ASMM),就自动启动了ASMM特性。启动后,sga中各个内存的大小由oracle自行控制,不需要人为指定。这样就能使sga的利用率达到最佳,从而节省内存成本。sga_target的大小不能超过sga_max_size。当sga_target小于sga_max_size时,实例启动后,sga_max_size就自动变为和sga_target一样的值了。
以下sga内存区由ASMM来自动调整:共享池,java池,大池,数据缓存区,流池。
10g开始,虽然修改sga后,还是需要重启实例才能生效,但是有了sga_target之后,可以将sga_max_size设置偏大,再根据实际需要调成sga_target的值。
Database Buffer Cache
保存最近从数据文件中读取的数据块。数据高速缓存块由许多大小相等的缓存块组成。
这些缓存块分为三类:
脏缓存块:保存已经修改过的缓存块。
空闲缓存块:没有数据,等待被写入数据。
命中缓存块(pinned ):保存最近正在被访问的缓存块。
通过两个列表来管理缓存块:
DIRTY列表保存已经被修改单还没有写入数据文件的脏缓存块。
LRU(least recently used)链表保存所有空闲缓存块,命中缓存块以及还没有被列入DIRTY列表的脏缓存块。LRU链表的两端分别叫做最近使用端(the most recently used MRU)和最近最少使用端(LRU)。
工作过程:
当一个oracle进程访问一个缓存时,会将这块缓存移到LRU链表中的MRU。而当越来越多的缓冲块被移到MRU端,那些已经过时的脏缓冲(即数据改动已经写入数据文件中,此时缓冲中的数据和数据文件中的数据已经一致)则被移到LRU链表中的LRU端。
当一个oracle进程第一次访问一个数据块时,会先朝着buffer cache中是否存在这个数据块的拷贝。如果发现这个数据块已经存在于buffer cache(即命中cache hit),他就会直接读从内存中取出该数据块。如果在buffer cache中没有发现该数据块(即未命中cache miss),它就需要先从数据文件中读取该数据块到buffer cache中,然后才访问该数据块。命中次数与进程读取次数之比就是衡量一个数据库性能的重要好指标:buffer hit ratio。
如果未命中,则需要先将数据块读取到缓存中去。这是oracle进程需要从空闲列表中找到一个适合大小的空闲缓存。如果空闲里诶包中可没有适合大小的空闲buffer,它就会从LRU端开始查找LRU链表,知道找到一个可重用的缓存块或者达到最大查找块数限制。在查找过程中,如果进程会找到一个脏缓存块,它将这个缓存块移到脏链表中,然后继续查找。
程序代码;
已经连接的会话信息,包括当前所有活动和非活动会话;
程序运行时必须的相关信息
oracle进程之间共享的信息和相互交流的信息
永久存储在外围存储介质上,被cache在内存中的数据
SGA
是一组为系统分配的共享的内存结构。
包括以下数据结构:
数据缓冲(Buffer Cache)
重做日志缓冲(Redo Log Buffer)
共享池(Shared Pool)
java池(Java Pool)
大池(Large Pool)
流池(Streams Pool)10g以后才有
数据字典缓存(Data Dictionary Cache)
其他信息
SQL> show sga
Total System Global Area 2147483648 bytes
Fixed Size 2085360 bytes
Variable Size 1241517584 bytes
Database Buffers 889192448 bytes
Redo Buffers 14688256 bytes
数据字典缓存和其他信息会被实例的后台进程所访问,它们在实例启动后就固定在SGA中了,而且不会改变,所有这部分又称为固定SGA(Fixed SGA)。这部分区域的大小一般小于100K。
Shared Pool,Java Pool,Large Pool和Streams Pool这几块内存区的大小是相应系统参数设置而改变的,所以可以统称为可变SGA(Variable SGA)。
SQL> show parameter sga
NAME TYPE VALUE
------------------------------------ --------------- ------------------------------
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 2G
sga_target big integer 2G
SQL> select NAME,VALUE,ISSES_MODIFIABLE,ISSYS_MODIFIABLE from v$parameter where NAME like 'sga%';
NAME VALUE ISSES_MODIFIABL ISSYS_MODIFIABLE
-------------------- -------------------- --------------- --------------------
sga_max_size 2147483648 FALSE FALSE
sga_target 2147483648 FALSE IMMEDIATE
如果ISSYS_MODIFIABLE返回的是false,说明该参数无法用alter system语句动态修改,需要重启数据库。
所以sga_max_size是不可以动态修改的。
相关参数说明
sga_max_size
控制SGA使用虚拟内存的最大大小
当实例启动后,各个内存区只分配实例所需要的最小大小,在随后的运行过程中,再根据需要扩展他们的大小,而他们的综合大小受到了sga_max_size的限制。如果在设置参数时,指定区域为spfile时,是不会受到这个限制的。
pre_page_sga
如果为true,实例一启动后,所有SGA都分配到物理内存。
lock_sga
为true时,可将全部SGA都锁定在物理内存中。
sga_target
10g之前,SGA的各个内存区在分配之后,只能给本区使用,相互之间是不能共享的。10g的新特性,自动共享内存管理(Automatic Shared Memory Management ASMM)。 控制这一特性的,就是sga_target。一旦给sga_target指定值后(默认为0,即没有启动ASMM),就自动启动了ASMM特性。启动后,sga中各个内存的大小由oracle自行控制,不需要人为指定。这样就能使sga的利用率达到最佳,从而节省内存成本。sga_target的大小不能超过sga_max_size。当sga_target小于sga_max_size时,实例启动后,sga_max_size就自动变为和sga_target一样的值了。
以下sga内存区由ASMM来自动调整:共享池,java池,大池,数据缓存区,流池。
10g开始,虽然修改sga后,还是需要重启实例才能生效,但是有了sga_target之后,可以将sga_max_size设置偏大,再根据实际需要调成sga_target的值。
Database Buffer Cache
保存最近从数据文件中读取的数据块。数据高速缓存块由许多大小相等的缓存块组成。
这些缓存块分为三类:
脏缓存块:保存已经修改过的缓存块。
空闲缓存块:没有数据,等待被写入数据。
命中缓存块(pinned ):保存最近正在被访问的缓存块。
通过两个列表来管理缓存块:
DIRTY列表保存已经被修改单还没有写入数据文件的脏缓存块。
LRU(least recently used)链表保存所有空闲缓存块,命中缓存块以及还没有被列入DIRTY列表的脏缓存块。LRU链表的两端分别叫做最近使用端(the most recently used MRU)和最近最少使用端(LRU)。
工作过程:
当一个oracle进程访问一个缓存时,会将这块缓存移到LRU链表中的MRU。而当越来越多的缓冲块被移到MRU端,那些已经过时的脏缓冲(即数据改动已经写入数据文件中,此时缓冲中的数据和数据文件中的数据已经一致)则被移到LRU链表中的LRU端。
当一个oracle进程第一次访问一个数据块时,会先朝着buffer cache中是否存在这个数据块的拷贝。如果发现这个数据块已经存在于buffer cache(即命中cache hit),他就会直接读从内存中取出该数据块。如果在buffer cache中没有发现该数据块(即未命中cache miss),它就需要先从数据文件中读取该数据块到buffer cache中,然后才访问该数据块。命中次数与进程读取次数之比就是衡量一个数据库性能的重要好指标:buffer hit ratio。
如果未命中,则需要先将数据块读取到缓存中去。这是oracle进程需要从空闲列表中找到一个适合大小的空闲缓存。如果空闲里诶包中可没有适合大小的空闲buffer,它就会从LRU端开始查找LRU链表,知道找到一个可重用的缓存块或者达到最大查找块数限制。在查找过程中,如果进程会找到一个脏缓存块,它将这个缓存块移到脏链表中,然后继续查找。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24989466/viewspace-1332945/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24989466/viewspace-1332945/