1.Oracle的内存结构图?
Oracle的内存结构是由SGA和PGA两大部分组成的,对于PGA是和进程相关的,每一个服务器进程和后台进程都对应一个PGA。而SGA是Oracle实例的重要组成部分,主要包括:JAVA POOL/Large POOL/Share POOL/数据字典缓冲区/重做日志缓冲区/数据缓冲区/数据流POOL等等。具体的结构图可以参考各种Oracle书籍。
2.SGA/实例/数据库以及会话之间的关系?
当数据库启动的时候(startup),会创建一个SGA和启动相关的进程,SGA和这些进程构成了一个实例。实例和SGA是一一对应的关系,正常情况下,每个实例会和一个数据库进行连接。当用户需要访问数据库中的信息时,就要和实例中的服务器进程进行连接,产生一个会话,然后通过SGA访问数据库。一个服务器进程可以同时和几个用户进行连接,进而可以同时产生多个会话,因此实例和会话是一对多的关系。
3.什么是固定SGA(fixed SGA)?
固定SGA存储的是数据库和实例的状态信息,提供给后台进程使用。在这部分内容中不会存储用户的数据。
4.什么是SGA的粒度单位?它的值是如何确定的?SGA_MAX_SIZE的作用?如果它的值过大,会产生什么影响?SGA的容量大小和哪些要素相关?(SGA的内存管理)
SGA的粒度指的是SGA内存分配的最小单位,SGA的各个组件是以粒度为大小来进行内存分配的,同时Oracle通过粒度的数量来掌握SGA使用内存的情况。一般情况下,如果SGA的容量小于1G,则粒度是4M;如果SGA的容量大于1G,则粒度是16M。不过这个规律不是固定的,和Oracle 当前所处的系统环境有关。Oracle对SGA分配的内存总量不能超过SGA_MAX_SIZE。如果SGA_MAX_SIZE的值设置的比较大,这样有利于SGA内存的分配,可以提高数据库库访问的性能。但是不能过大,如果SGA的内存有一大部分使用的是交换区,则会增加I/0次数,降低系统的性能。SGA的容量大小主要由下面几个参数共同决定:SGA_MAX_SIZE,DB_CACHE_SIZE,LOG_BUFFER,JAVA_POOL_SIZE,SHARED_POOL_SIZE,LARGE_POOL_SIZE.
现在Oracle版本支持SGA内存空间的自动化管理,只要设置参数SGA_TARGET这个参数,Oracle会根据系统的具体情况来进行内存空间的分配,这样可以使内存的利用率达到最大。需要注意的是如果SGA_TARGET的值超过了SGA_MAX_SIZE的值,后者的值将会被忽略。SGA的内存管理还可以进行
5.如果要查询SGA各个内存组件当前使用的粒度大小,数据字典表是哪个?查询各个存组件当前容量及最近一次修改容量操作的类型和时间,数据字典表是哪个?调整SGA内存容量的历史信息,数据字典表是哪个?
如果需要查询SGA的各个组件使用的粒度大小,查询字典表V$SGAINFO;如果需要查询各个组件容量的更改操作的类型和时间,可以查询字典表V$SGA_DYNAMIC_COMPONENTS ;如果要查询SGA内存容量操作的历史信息,可以查询数据字典表V$SGA_REDOSIZES_OPS.
6.数据缓存区的作用?数据缓冲区维护哪些列表?搜索缓冲区的过程?
数据缓冲区是用来存储Oracle从数据文件中读取的数据的,在数据缓冲区中维护着两张列表,待写缓冲区列表和最近最少使用(LRU)列表。待写缓冲区列表就是将要写入到文件中的缓冲区。最近最少使用的列表中包括还没有来得急放入待写缓冲区的脏缓冲区/空闲缓冲区/锁定缓冲区。数据缓冲区的管理使用的是LRU算法,对于LRU列表的两端可以用LRU和MRU来表示。对于刚从数据文件中读入的数据,首先把它放入到MRU段(最近使用)。当需要查询数据时,Oracle首先查找数据缓冲区,看有没有需要的数据,如果有则将它移到MRU端,并取出缓冲区中的数据。如果用户需要空闲缓冲区,Oracle会搜索LRU列表,如果搜索的时间超过了一定的值,Oracle就会启动写数据库的操作,将脏缓冲区的数据写入到数据文件当中。
7.数据缓冲区和全表扫描?数据缓冲区的容量管理?数据缓冲区有哪些缓冲池?
对于全表扫描,Oracle认为扫描的数据是不会经常使用的,所以在进行全表扫描时,从数据文件读出的数据是存放在LRU列表的MRU端的。
数据缓冲区的容量由DB_CACHE_SIZE/DB_BLOCK_SIZE以及非标准的数据库容量等部分组成,在进行手工管理时可以设置这些参数。
在数据缓冲区中主要有三种缓冲池,分别是KEEP/RECYCLE/DEFAULT缓冲池。