SGA和PGA浅析

--SGA和PGA浅析


--SGA

SYS@PROD1> select pool,sum(bytes) from v$sgastat group by pool;

POOL	     SUM(BYTES)
------------ ----------
	      384225152
java pool	4194304
streams pool	8388608
shared pool   331350016
large pool	4194304



我们可以看到SGA由java pool(java 池)、shared pool(共享池)、large pool(大池) 和没有名字的池组成。
其中那块没有名字的内存又包括块缓冲区(缓存的数据库块)、重做日志缓冲区和“固定SGA”区专用的内存。


1、Fixed SGA 固定SGA
      可以把这个区想成是 SGA中的“自启”区,Oracle在内部要使用这个区来找到SGA的其他区。换一句话,就是在这个内存里面存有其他区的地址,我们可以通过访问这个区来查找到其他区的位置!
2、Redo Buffer 重做缓冲区
      如果数据需要写到在线重做日志中,则在写至磁盘之前要在重做缓冲区(redo buffer)中临时缓存这些数据。由于内存到内存的传输比内存到磁盘的传输快得多,因此使用重做日志缓冲区可以加快数据库的操作。我的理解是,如果没有这个区,那我们操作一次数据库就访问一次磁盘,而如果有的话,则可以操作很多次之后才访问一次磁盘。速度当然要快很多了。
3、Block Buffer 块缓冲区缓存
     Oracle将数据库块写至磁盘之前,另外从磁盘读取数据库块之后,就会把这些数据库块存储在块缓冲区缓存(block buffer cache)中。对我们来说,这是SGA中一个很重要的区。如果太小,我们的查询就会永远也运行不完。如果太大,又会让其他进程饥饿(例如,没有为专用服务器留下足够的空间来创建其PGA,甚至无法启动)。这个其实是缓存数据,也是为什么你第二次进行同一个操作的时候比第一次要快的原因,因为他可以直接从这个缓存里面取就可以了!但是如果你第二天来继续进行同一操作应该是比较慢的,因为在那个缓存里面已经没有你要取的数据了!( 就是通常说的内存老化,也就是缓存你数据的那块内存被别人用了。这就是LRU算法),为了使自己要的数据不那么快老化。oracle把这块内存划分为三种类型:
     默认池(default pool):所有段块一般都在这个池中缓存。这就是原先的缓冲区池(原来也只有一个缓冲区池)。
     保持池(keep pool):按惯例,访问相当频繁的段会放在这个候选的缓冲区池中,如果把这些段放在默认缓冲区池中,尽管会频繁访问,但仍有可能因为其他段需要空间而老化(aging)。
     回收池(recycle pool):按惯例,访问很随机的大段可以放在这个候选的缓冲区池中,这些块会导致过量的缓冲区刷新输出,而且不会带来任何好处,因为等你想要再用这个块时,它可能已经老化退出了缓存。要把这些段与默认池和保持池中的段分开,这样就不会导致默认池和保持池中的块老化而退出缓存。
4、shared pool(共享池)
     共享池就是Oracle缓存一些“程序”数据的地方。在解析一个查询时,解析得到的表示(representation)就缓存在那里。在完成解析整个查询的任务之前, Oracle会搜索共享池,看看这个工作是否已经完成。你运行的PL/SQL代码就在共享池中缓存,所以下一次运行时,Oracle不会再次从磁盘重新读取。PL/SQL代码不仅在这里缓存,还会在这里共享。如果有1 000个会话都在执行同样的代码,那么只会加载这个代码的一个副本,并由所有会话共享。Oracle把系统参数存储在共享池中。数据字典缓存(关于数据库对象的已缓存信息)也存储在这里。简单地讲,就像是厨房的水池一样,什么东西都往共享池里放。我的理解是:这是个共用的东西,大家都可以用。比如一个用户进行一次查询,在解析之前,查看共享池,这个sql语句是否已经缓存在这里了。如果在,他就没有必要再去进行解析了,因为已经解析好了,直接拿来用就可以了!这也是绑定变量为什么可以改善oracle性能的原因!
5、large pool 大池
    大池(large pool)并不是因为它是一个“大”结构才这样取名(不过,它可能确实很大)。之所以称之为大池,是因为它用于大块内存的分配,共享池不会处理这么大的内存块。
在Oracle 8.0引入大池之前,所有内存分配都在共享池中进行。如果你使用的特性要利用“大块的”内存分配(如共享服务器UGA内存分配),倘若都在共享池中分配就不太好。另外,与共享池管理内存的方式相比,处理(需要大量内存分配)会以不同的方式使用内存,所以这个问题变得更加复杂。共享池根据LRU来管理内存,这对于缓存和重用数据很合适。不过,大块内存分配则是得到一块内存后加以使用,然后就到此为止,没有必要缓存这个内存。我的理解是:其实是把原来属于共享池里面的一些特殊的内存拿出来进行不同的处理。因为这些内存用完之后就可以立即释放,而共享池的内存不存在释放问题,因为是大家共享的。
     大池专门用于以下情况:
共享服务器连接,用于在SGA中分配UGA区,因为一个用户断开之后,UGA就可以立即释放!
语句的并行执行,允许分配进程间的消息缓冲区,这些缓冲区用于协调并行查询服务器。一旦发送了缓冲消息就可以立即释放!
备份,在某些情况下用于RMAN磁盘I/O 缓冲区。因为写入磁盘之后,这些缓存可以立即释放!
6、Java pool Java池
    在数据库中运行Java代码时用到这部分内存。例如:编写Java存储过程在服务器内运行。需要注意的是,该内存与常见的Java编写的B/S系统并没关系。用JAVA语言代替PL/SQL语言在数据库中写存储过程才会用到这部分内存。
7、Stream pool 流池
    9iR2以上增加了“流”技术,10g以上在SGA中增加了流池。流是用来共享和复制数据的工具。
参考:http://blog.itpub.net/9399028/viewspace-682015/ 


SYS@PROD1> select table_name,buffer_pool from dba_tables where owner='SCOTT';

TABLE_NAME		       BUFFER_
------------------------------ -------
DEPT			       DEFAULT
EMP			       DEFAULT
SALGRADE		       DEFAULT
TEXT			       DEFAULT
E1			       DEFAULT
DEMO			       DEFAULT
OLD_E			       DEFAULT
SYS_TEMP_FBT		       DEFAULT
ALL_OBJECTS_UNLOAD	       DEFAULT
BONUS			       DEFAULT

10 rows selected.

SYS@PROD1> show parameter db_cache_size  --DEFAULT

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
db_cache_size			     big integer 0
SYS@PROD1> show parameter sga_target  --由于设置了SGA自动管理所有不需要设置db_cache_size

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
sga_target			     big integer 700M
SYS@PROD1> show parameter memory_target  --设置内存自动管理

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
memory_target			     big integer 0
SYS@PROD1> show parameter db_keep  --同db_cache_size

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
db_keep_cache_size		     big integer 0
SYS@PROD1> show parameter db_recycle  --同db_cache_size

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
db_recycle_cache_size		     big integer 0

--更改表的默认缓冲区缓存
SYS@PROD1> alter table scott.emp storage(buffer_pool keep);
 
Table altered.

SYS@PROD1> alter system set db_keep_cache_size=20m;

System altered.

SYS@PROD1> select table_name,buffer_pool from dba_tables where owner='SCOTT';

TABLE_NAME		       BUFFER_
------------------------------ -------
DEPT			       DEFAULT
EMP			       KEEP
SALGRADE		       DEFAULT
TEXT			       DEFAULT
E1			       DEFAULT
DEMO			       DEFAULT
OLD_E			       DEFAULT
SYS_TEMP_FBT		       DEFAULT
ALL_OBJECTS_UNLOAD	       DEFAULT
BONUS			       DEFAULT

10 rows selected.

SYS@PROD1> show parameter db_keep

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
db_keep_cache_size		     big integer 20M

--日志缓冲区需要手动设置大小
SYS@PROD1> show parameter log_buffer

NAME				     TYPE	 VALUE
------------------------------------ ----------- ------------------------------
log_buffer			     integer	 851968


--PGA
每个服务进程私有的内存区域,包含如下结构:
1)Private SQL area:包含绑定信息、运行时的内存结构。每个发出sql语句的会话,都有一个private SQL area(私有SQL区)
2)Session memory:为保存会话中的变量以及其他与会话相关的信息,而分配的内存区。
设置自动管理的相关视图
v$sga_target_advice
v$pga_target_advice
v$memory_target_advice


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值