Chinaunix首页 | 论坛 | 博客
  • 博客访问: 104574716
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类: Oracle

2008-04-30 16:36:15

Oracle从10g开始建议使用内存自动管理,通过设置初始化参数SGA_TARGET 和PGA_AGGREGATE_TARGET的大小来达到自动管理内存的目的。但你也可以手工调整。
下面我们将讨论以下主题:
-理解内存分配
-配置buffer cache
-配置shared pool和large pool
-配置redo log buffer
-PGA内存管理
理解内存分配
Oracle把信息是存储在磁盘中和缓冲在内存里。内存访问的速度比磁盘速度快很多,和内存相比,磁

盘访问消耗大量的时间在physical I/O上,而且还会在磁盘驱动路径计算和操作系统调度上消耗CPU资

源。由于这个原因,在内存存取数据要比磁盘高效得多。
一个非常重要的性能目标,就是尽可能的减少物理IO,通过更多在内存上重新获得数据。
Oracle强烈建议使用自动内存管理。(DBA的作用被machine代替了....)
Oracle企业管理区提供内存分配的建议:
在Database页面Related Links下点击Advisor Central,在Advisor Central页面点击Memory Advisor访问

Memory Parameters SGA and PGA页面。
动态改变缓存大小
如果没有使用自动内存管理,也可以动态的改变shared pool, large pool, buffer cache,
和 process-private memory的大小。下面我们将讨论这个话题:
这些pool通过诸如DB_CACHE_ADVICE, JAVA_POOL_SIZE, LARGE_POOL_SIZE,
LOG_BUFFER, 和SHARED_POOL_SIZE参数配置,可以通过ALTER SYSTEM进行动态修改。
Oracle 内存缓冲
Oracle主要的内存缓冲包括:
■ Shared pool
■ Large pool
■ Java pool
■ Buffer cache
■ Streams pool size
■ Log buffer
■ Process-private memory(用于排序和hash joins)
自动共享内存管理
自动共享内存管理简化了SAG的配置,建议使用。通过设置SGA_TARGET非0和设置STATISTICS_LEVEL

为TYPICAL 或者ALL。SGA_TARGET是你准备使用的SGA内存总量。为了正常的运行,数据库将分配以

下内存池:
■Database buffer cache (default pool)
■ Shared pool
■ Large pool
■ Java pool
■ Streams pool
如果有必要,你可以在初始化参数中设置这些参数的最小值。
通过企业管理器,在Memory Parameters SGA页面,SGA_TARGET可以动态改变。通过查询

V$SGA_TARGET_ADVICE视图,可以查看SGA大小的建议,使用ALTER SYSTEM命令改变SGA大小,但要

小于等于SGA_MAX_SIZE。改变这个值以后,Oracle会自动的调整pools的大小。
反之,在启动的时候设置SGA_TARGET为0,内存就不会自动分配,可以通过手工配置

DB_CACHE_SIZE, SHARED_POOL_SIZE, LARGE_POOL_SIZE,JAVA_POOL_SIZE, 和STREAMS_POOL_SIZE来

分配SGA。
下面的一些池是不会受自动内存管理影响的:
■ Log buffer
■ KEEP, RECYCLE, 和其它非默认块大小的pool
■ 固定SGA和其它内部分配
通过设置DB_KEEP_CACHE_SIZE,DB_RECYCLE_CACHE_SIZE, DB_nK_CACHE_SIZE, 和LOG_BUFFER来设置

这些pool的值。但log buffer pool 和process-private memory必须重启才能生效。
内存的最小分配单位成为颗粒。如果SGA小于1G,那么为4M。如果大于1G,则为16M。颗粒的大小在

实例启动后,是不会改变的。当前系统使用的颗粒大小,可以通过视图

V$SGA_DYNAMIC_COMPONENTS来查看。
SGA的最大大小是由SGA_MAX_SIZE决定的,它不能被动态改变。
关于动态的改变内存分配的一些视图:
V$SGA_CURRENT_RESIZE_OPS:SGA当前的调整情况
V$SGA_RESIZE_OPS:至少800次对SGA的调整情况记录,但不包括当前的。
V$SGA_DYNAMIC_COMPONENTS:SGA的组成信息,包含所有已经完成调整后的信息。
V$SGA_DYNAMIC_FREE_MEMORY:下一次内存分配可使用的空闲内存量。
应用程序应该考虑:
配置内存的时候,要考虑应用的需求,反之对应用使用的缓存的调优能显著改善资源需求,诸如latch

锁,CPU,I/O。
缓存应该被设计为最高效的使用操作系统和数据库的资源。
Oracle的内存分配应该和应用的需求息息相关。
如果你的应用使用了java,那应该考虑是否要调整java pool。
操作系统内存的使用
大多数操作系统应该考虑以下:
减少内存分页,分页发生在内存把数据转存到磁盘的过程中。分页会降低性能。使用操作系统的工具

来检测是否发生了大量的分页。
锁定SGA在内存中
在大多数系统中,设置LOCK_SGA=ture,将不会发生分页。

 

原文:http://valen.blog.ccidnet.com/blog-htm-itemid-150747-do-showone-type-blog-uid-51502.html

阅读(672) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~