设为首页 加入收藏

TOP

OracleSGA详解(三)
2015-11-21 01:37:32 来源: 作者: 【 】 浏览:3
Tags:OracleSGA 详解
.object_id = bh.OBJD and o.owner != 'SYS'group by o.object_name having count(*) > 100 order by count(*) desc

确定好使用 keep池的表后,可以根据这些表的实际大小之和来计算缓冲区的大小。由于这个大小可以比较准确的计算出来,因此可以对这些表使用 cache,以保证即使采用全表扫描得到的数据也可以被缓冲。

通常情况下,并不追求 keep池的命中率达到 100%,如果命中率为 100%,则说明给 keep池的内存空间过大,有部分内存被浪费。即使 keep池中缓存的都是些最经常访问的表,这些访问操作也不大可能访问到表中所有的数据。因此,可以适当的减少 keep池的内存分配,使 keep池的命中率维持在接近 100%的数值。将这部分内存分配给其他的缓冲区,可以得到更高的效率。

可以采用下面的SQL语句来计算 KEEP池的命中率。

SQL> select name,physical_reads, db_block_gets, consistent_gets, 1 -(physical_reads /(db_block_gets + consistent_gets)) "hit ratio" fromv$buffer_pool_statistics where name = 'KEEP';

n RECYCLE池

RECYCLE池用来缓存那些不希望保存在内存中的表。例如很少进行扫描或者访问的表。如果应用程序以一种随机的方式访问一张比较大的表,这些被缓冲的数据在被清除出内存之前,很少会有机会再次被访问。这些数据存放在缓冲区当中,不仅会浪费内存空间,而且可能把其他的一些有可能被访问的数据清除出去。这些数据没必要保存在缓冲区当中,可以通过使用 RECYCLE池来避免这些数据对其他数据的影响。

调整参数db_recycle_cache_size的大小来设置recycle池。一般来说,不需要给 recycle池很大的内存空间,因为recycle池中的数据没有什么被缓存的价值。设置较小的缓冲区可以将更多的内存留给keep 和default池。但是,如果缓冲区太小的话,数据可能在事务结束之前就从内存从中被清除了,这会导致额外的性能问题。

SQL> truncate tabletest_eat_memory;

SQL> select * fromtest_default;

统计信息

0 recursive calls

0 db block gets

7 consistent gets

0 physical reads

0 redo size

407 bytes sent via SQL*Net to client

385 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

1 rows processed

SQL> alter tabletest_eat_memory storage(buffer_pool recycle);

SQL>insert intotest_eat_memory select rpad('1',4000,'1'), rpad('2',4000,'2'), rpad('3',4000,'3'),rpad('4',4000,'4'),rpad ('5',4000,'5'), rpad('6',4000,'6'), rpad('7',4000,'7'),rpad('8',4000,'8'), rpad('9' ,4000,'9'), rpad('0',4000,'0 ) from all_objectswhere rownum<=15000; --插入15000行数据

统计信息

10410 recursive calls

564195 db block gets

108584 consistent gets

620 physical reads

637527688 redo size --大约插入了638M数据

678 bytes sent via SQL*Net to client

803 bytes received via SQL*Net from client

4 SQL*Net roundtrips to/from client

91 sorts (memory)

0 sorts (disk)

15000 rows processed

SQL> commit;

SQL> select * fromtest_default;

统计信息

70 recursive calls

0 db block gets

0 consistent gets

12 physical reads

0 redo size

407 bytes sent via SQL*Net to client

385 bytes received via SQL*Net from client

2 SQL*Net roundtrips to/from client

2 sorts (memory)

0 sorts (disk)

rows processed

在这个例子中,将进行批操作的表改为recycle池,在批操作执行完成后,发现 test_default表的数据仍然可以在default池中找到。这种方法屏蔽了批操作对系统的影响。

小结

对于大多数的系统而言,使用 default池就够了。但是如果内存空间相对较小,或者对系统中表的使用情况有比较清晰的认识,则可以通过配置 keep池和 recycle池来细化内存的分配,提高数据缓冲区的命中率,降低批操作对系统的影响。

虽然 keep池、recycle池用来缓存不同类型的数据,但是他们的机制是相同的,他们采用的都是LRU算法。如果keep池分配的内存不足,那么也会有部分数据被清除出内存;如果 recycle池的内存分配足够,也可以保证其中的数据全部缓存。从本质上讲, keep池和 recycle池并没有什么区别,只是名字不同而已。

如果给 keep池或者 recycle池分配的内存大小不合适,不但不会提高性能,而且会造成性能的下降。以 keep池为例,内存分配小了,这些经常被访问的、数据就会有部分被清除出内存,导致命中率降低。如果内存分配过大,则导致 default池内存要相应的减少,default池不仅包括用户部分数据,而且也包括数据字典的缓冲。因此, default池内存的不足,必然导致整个系统性能的下降。而且,由于真实环境中,所有的表的大小都处于变化之中,因此,需要经常对不同缓冲区的命中率进行检查,并随时调整缓冲区的大小以满足数据不断变化的需要。

l 重做日志高速缓存

2 重做日志高速缓存大小由初始化参数LOG_BUFFER指定,可以在运行期间修改该参数。

2 工作原理:为了加快访问速度和工作效率,重做记录并不直接写入重做日志文件中,而是首先从数据高速缓存写入重做日志高速缓存。当重做日志高速缓存中的重做记录达到一定数量或某个时间点时,再由LGWR进程分批写入重做日志文件中(即ORACLE 总是先日志后文件或先内存后磁盘)。由于重做日志文件是循环使用的,所以当重做日志文件切换时,还会由ARCn(如果启用了归档日志模式)进程将即将要被覆盖的重做日志文件中的数据写入到归档日志文件中,作为备份。

SHOWPARAMETER LOG_BUFFER; ------查询重做日志缓存的大小

SELECT* FROM V$SYSSTAT; ------

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Hibernate建立一对多双向关联关系 下一篇对oracle controlfile进行转储

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: