关于Oracle的内存问题
Oracle中内存结构主要包括两大类分别是SGA和PGA,其中SGA代表的是系统全局区,PGA代表程序全局区。
Oracle内存主要存储的有执行程序代码(PL/SQL,JAVA);关于已经连接的会话的信息,包括当前所有活动和非活动会话;程序运行时必须的相关信息;例如查询计划;Oracle进程之间共享的信息和相互交流的信息,例如锁;程序运行期间所需要的数据以及存储在外存储上的缓冲信息等。
内存是数据库体系结构中非常重要的一部分,也是影响数据库性能的主要因素之一。在数据库运行时,内存主要用于存储各种信息。按照系统对内存的使用方法不同,Oracle数据库的内存主要可以分为以下的五种结构,分别是系统全局区(SGA),程序全局区(PGA),排序区(SORT AREA)大池(LARGE POOL)以及java池(JAVA POOL)。
1系统全局区(SGA)
系统全局区(SGA)有一组内存结构组成,是所有的用户进程共享的一块内存区域。其中可以包含一个数据库实例的数据和控制信息。在一个数据库实例中,可以有多个用户进程,这些用户进程可以共享系统全局区中的数据,因此系统全局区又称为共享全局区。
系统全局区(SGA)的总内存大小由参sga_max_size决定,通过使用SHOW PARAMETER语句可以查看该参数的信息,如下:
SQL> SHOW PARAMETER SGA_MAX_SIZE;
NAME TYPE VALUE
----------------------------------------------- ------------------------------
sga_max_size big integer 2432M
系统全局区(SGA)按照不同的作用可以分为:数据缓冲区,日志缓冲区和共享池。
(1) 数据缓冲区
数据缓冲区主要存放最近访问的数据块信息,当用户向数据库请求数据时,如果所需的数据已经位于数据缓冲区,则Oracle将直接冲数据缓冲区中提取数据并返回给用户,而不必再从数据文件中读取数据。数据缓冲区的大小由参数db_cache_size决定,可以通过SHOW PARAMETER语句查看该参数的信息,如下:
SQL> SHOW PARAMETER DB_CACHE_SIZE;
NAME TYPE VALUE
-------------------------------------------------------------- ----------
db_cache_size big integer 0
(2) 日志缓冲区
(3) 日志缓冲区用于存储数据的修改操作信息。当日志缓冲区
(4) 的日志数据达到一定限度时,由日志写入进程LGWR将日志写入磁盘的日志文件。日志缓冲区的大小由参数log_buffer决定,通过SHOW PARAMETER语句查看参数的信息,如下:
SQL> SHOW PARAMETER LOG_BUFFER;
NAME TYPE VALUE
----------------------------------------------- ----------------- ----------
log_buffer big integer 12896K
(3)共享池
共享池是对sql语句和PL/SQL程序进行语法分析,编译和执行的内存区域,用于保存最近执行的SQL语句,PL/SQL程序的数据字典信息。
共享池主要包括三种缓存分别是:库缓存,数据字典缓存和用户全局区。其中库缓冲白村sql语句的分析代码和执行计划;数据字典缓冲区保存数据字典中得到的表,列定义和权限;用户全局区保存用户的会话信息。
共享池的大小由参数shared_pool_size决定,可以通过show parameter语句查询该参数的信息,如下:
SQL> SHOW PARAMETER SHARED_POOL_SIZE;
NAME TYPE VALUE
----------------------------------------------- ----------------------
shared_pool_size big integer 0
2.程序全局区(PGA)
程序全局区包含单个用户或服务器数据和控制信息,是Oracle系统分配给一个进程的私有内存区域。其在用户进程连接到Oracle数据库并创建一个会话时,由Oracle自动分配。程序全局区的大小由参数pga_aggregate_target决定,可以通过show parameter语句查询该参数的信息,如下:
SQL> SHOW PARAMETERPGA_AGGREGATE_TARGET;
NAME TYPE VALUE
----------------------------------------------- -------
pga_aggregate_target big integer 807M
3.排序区
排序区是Oracle系统为排序操作所产生的临时数据提供的内存空间。实际上,在Oracle中,存放用户排序操作所产生的临时数据的区域有两个分别是内存排序区和磁盘临时段。
当进行排序操作时,Oracle系统会优先使用内存排序区进行排序,如果内存空间不够,才会使用磁盘临时段进行排序。
排序区的大小由参数sort_area_size决定,通过SHOW PARAMETER语句查询该参数的信息,如下:
SQL> SHOWPARAMETER SORT_AREA_SIZE;
NAME TYPE VALUE
----------------------------------------------- --------
sort_area_size integer 65536
4.大型池
大型池是系统全局区中可选的一个内存结构,用于提供一个大的缓冲区供数据库的备份与恢复操作使用。大型池的大小由参数large_pool_size决定,通过SHOW PARAMETER语句查询该参数的信息,如下:
SQL> SHOWPARAMETER LARGE_POOL_SIZE;
NAME TYPE VALUE
----------------------------------------------- --------
large_pool_size big integer 0
5.java池
Java池,用于在数据库中支持java的运行。例如使用java编写一个存储过程,这时Oracle通过java的虚拟机就会使用java池来处理用户会话中的java存储过程。其大小由参数java_pool_size决定,通过SHOW PARAMETER语句查询该参数的信息,如下:
SQL> SHOWPARAMETER JAVA_POOL_SIZE;
NAME TYPE VALUE
----------------------------------------------- ----------- ----------- ----------- ----
java_pool_size big integer 0