PGA是一个服务器进程的专用的私有内存区,而SGA则是共享内存区 SGA由多个部分组成: 1、 固定SGA(Fixed SGA) 2、 块缓冲区(Db cache) 3、 重做日志缓冲区(Redo log buffer) 4、 Java池(Java pool) 5、 大池(Large pool) 6、 共享池(Shared pool) 7、 流池(Stream pool) 有如下参数控制共享池相关组件大小: 1、 JAVA_POOL_SIZE:控制Java池大小。 2、 SHARED_POOL_SIZE:9i中控制共享池中占用最大的部分,10g以上控制共享池大小。 3、 LARGE_POOL_SIZE:控制大池大小。 4、 DB_*K_CACHE_SIZE:控制不同块大小的缓冲区大小。 5、 LOG_BUFFER:控制重做日志缓冲区大小。 6、 SGA_TARGET:10g以上控制自动SGA内存管理的总内存大小。 7、 SGA_MAX_SIZE:控制SGA可以达到的最大大小,改变需重启数据库。
SGA各组件作用 1, 固定SGA: 顾名思义,是一段不变的内存区,指向SGA中其他部分,Oracle SGA通过它找到SGA中的其他区,可以简单理解为用于管理的一段内存区。 SQL> show parameter sga; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ lock_sga boolean FALSE pre_page_sga boolean FALSE sga_max_size big integer 352M sga_target big integer 0
2、块缓冲区: 查询时,Oracle会先把从磁盘读取的数据放入内存,以后再查询相关数据时不用再次读取磁盘。插入和更新时,Oracle SGA会现在该区中缓存数据,之后批量写到硬盘中。通过块缓冲区,Oracle可以通过内存缓存提高磁盘的I/O性能。 块缓冲区中有三个区域: 默认池(Default pool):所有数据默认都在这里缓存。 保持池(Keep pool):用来缓存需要多次重用的数据。 回收池(Recycle pool):用来缓存很少重用的数据。 原来只有一个默认池,所有数据都在这里缓存。这样会产生一个问题:大量很少重用的数据会把需重用的数据“挤出”缓冲区,造成磁盘I/O增加,运行速度下降。后来分出了保持池和回收池根据是否经常重用来分别缓存数据。 这三部分内存区需要手动确定大小,并且之间没有共享。例如:保持池中已经满了,而回收池中还有大量空闲内存,这时回收池的内存不会分配给保持池。 9i开始,还可以设置db_nk_cache。9i之前数据库只能使用相同的块大小。9i开始同一个数据库可以使用多种块大小(2KB,4KB,8KB,16KB,32KB),这些块需要在各自的db_nk_cache中缓存。如果为不同的表空间指定了不同的块大小,需要为其设置各自的缓冲区。 SQL> show parameter Db cache
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ clonedb boolean FALSE 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_block_buffers integer 0 db_block_checking string FALSE db_block_checksum string TYPICAL db_block_size integer 8192 db_cache_advice string ON
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_cache_size big integer 0 db_create_file_dest string db_create_online_log_dest_1 string db_create_online_log_dest_2 string db_create_online_log_dest_3 string db_create_online_log_dest_4 string db_create_online_log_dest_5 string db_domain string db_file_multiblock_read_count integer 23 db_file_name_convert string db_files integer 200
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_flash_cache_file string db_flash_cache_size big integer 0 db_flashback_retention_target integer 1440 db_keep_cache_size big integer 0 db_lost_write_protect string NONE db_name string sztech1 db_recovery_file_dest string /u01/app/oracle/fast_recovery_area db_recovery_file_dest_size big integer 4152M db_recycle_cache_size big integer 0 db_securefile string PERMITTED
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_ultra_safe string OFF db_unique_name string sztech1 db_unrecoverable_scn_tracking boolean TRUE db_writer_processes integer 1 dbwr_io_slaves integer 0 rdbms_server_dn string standby_archive_dest string ?/dbs/arch standby_file_management string MANUAL xml_db_events string enable
3、重做日志缓冲区(Redo log buffer): 数据写到重做日志文件之前在这里缓存,在以下情况中触发: 每隔3秒 缓存达到1MB或1/3满时 用户提交时 缓冲区的数据写入磁盘前
SQL> show parameter Redo log buffer
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ redo_transport_user string
4、Java池(Java pool): 为在数据库中运行Java代码时预备的内存区域,用JAVA语言代替PL/SQL语言在数据库中写存储过程才会用到这部分内存,主要用于支持JAVA虚拟机(JVM)、流池(Streams Pool)支持流,如果没有使用javaproc,java_pool不是必须的。 SQL> show parameter java pool NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ java_jit_enabled boolean TRUE java_max_sessionspace_size integer 0 java_pool_size big integer 0 java_restrict string none java_soft_sessionspace_limit integer 0
5、大池(Large pool): 下面三种情况使用到大池: 并行执行:存放进程间的消息缓冲区 RMAN:某些情况下用于磁盘I/O缓冲区 共享服务器模式:共享服务器模式下UGA在大池中分配(如果设置了大池) SQL> show parameter Large_pool
NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ large_pool_size big integer 0
6, 共享池(Shared pool) 共享池是SGA中最重要的内存段之一。共享池太大和太小都会严重影响服务器性能。SQL和PL/SQL的解释计划、代码,数据字典数据等等都在这里缓存。 需要注意的是,shared_pool_size参数在9i中控制共享池中占用最大的部分,10g以上控制共享池总大小。shared_pool_reserved_size。此参数是用来指定保留的共享池空间大小,用于满足将来的大的连续的共享池空间请求。 SQL> show parameter Shared Pool NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ hi_shared_memory_address integer 0 max_shared_servers integer shared_memory_address integer 0 shared_pool_reserved_size big integer 2306867 shared_pool_size big integer 0 shared_server_sessions integer shared_servers integer 1
7、流池(Stream pool) 9iR2以上增加了“流”技术,10g以上在SGA中增加了流池。流是用来共享和复制数据的工具。 SQL> show parameter Stream pool NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ streams_pool_size big integer 0
|