首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 冲浪宝典 > 网络资源 > Oracle内存与调整
【标  题】:Oracle内存与调整
【关键字】:Oracle
【来  源】:http://www.cublog.cn/u/16743/showart.php?id=98119

Oracle内存与调整

 

对于SGA,可以用sqlplus查询:

SQL>select * from v$sga;

Fixed Size

Variable Size    

包含了shared_pool_sizejava_pool_sizelarge_pool_size等内存设置和管理内存缓冲区等内存结构的hash table,块头信息等

DataBase Buffers  

指数据缓冲区,在8i中有default pool default_pool_keepdefaule_pool _recyle三部分内存,在9i中有db_cache_size,db_keep_cache_size,db_reycle_cache_size, db_cn_cache_size等几部分内存,  Oracle8i三部分内存的总和是:db_block_buffer* db_ block_size .

Redo buffers

指日志缓冲区,log_buffer,额外一点:对于v$parameter,v$sgastat,v$sga查询值可能不一样。V$parameter是用户在初始化的时候设置的值,v$sgastat是实际分配缓冲区的大小(因为实际分配的缓冲区是离散的,也不是以block为单位的),v$sga是在分配了日志缓冲区以后,为了保护日之缓冲区,设置了一些保护页,通常我们发现保护页的大小大约为11k左右。

SQL>select substr(name,1,10) name,substr(value,1,10) value from v$parameter where name=’log_buffer’;

SQL>select * from v$sgastat;

SQL>select * from v$sga;

8iSGA

ORACLE 8.0.X 版本

SGA=((db_block_buffers*blocksize)+(shared_pool_size+large_pool_size+ log_buffers) +1MB

ORACLE 8.1.X 版本

SGA=(db_block_buffers*blocksize)+(share_pool_size+large_pool_size+java_pool_size+log_buffers)+1MB

理论上SGA可占用os系统物理内存的1/2——1/3

推荐:SGA=0.45*os  RAM

关于数据库有多少个并发连接,这实际上关系到PGA的大小(MTS下还有large_pool_size).事实上这个问题应该说还跟OLTP类型或者OLAP类型相关,对于OLTP类型oracle倾向于可使用的MTS,对于OLAP类型使用独立模式,同时OLAP还可能涉及到大量的排序操作的查询,这些都影响到我们内存的使用,那么所有的问题综合起来,实际上主要反映在UGA的大小上,UGA主要包含以下部分内存设置

SQL>show parameters area_size

NAME                                 TYPE                VALUE

------------------------------------ ----------------------------------------------------

bitmap_merge_area_size               integer                 1048576

create_bitmap_area_size               integer                  388608

hash_area_size                       integer                 1048576

sort_area_size                        integer                 524288

workarea_size_policy                  string                  AUTO

通常我们习惯通过直观的公式来表达内存分配的问题:

        Os使用内存+sga+并发执行进程数*(sort_area_size+2M)<0.7*总内存

(公式是死的,系统是活得,实际应用的调整不必框公式,这不过是一个参考建议)

在我们实际应用中,假如采用的是裸设备,我们可适当的增大SGA(如果需要的话)。由于目前几乎所有的操作系统都使用虚拟缓存,所以实际上如果就算SGA设置的比较大也不会导致错误,而是可能出现频繁的内存页的换入换出(page in/out)。在操作系统一级如果观察这个现象,那么我们就需要调整内存的设置。

SGA内存参数设置:

Log_buffer

   对于日志缓冲区的大小设置,通常我觉得没有过多的建议,因为参考LGWR写的触发条件之后,我们会发现通常超过3M意义不是很大,作为一个正式系统,可能考虑先设置这部分log_buffer=1—3M大小,然后对具体情况在调整

Large_pool_size

   对于大缓冲池的设置,假如不使用MTS,加以在20--30M足够了,这部分主要用来保存并行查询时候的一些信息,还有就是RMAN在备份的时候可能使用到,如果设置了MTS,则由于UGA部分要移入到这里,则需要具体根据server process数量和相关会话内存参数的设置来综合考虑这部分大小的设置。

Java_pool_size

   假如数据库没有使用java,我们通常认为保留10M--20M大小足够,甚至更小到32K,但是具体安装数据库的时候的组件相关。

Shared_pool_size

   这是迄今为止最有争议的一部分内存设置,这部分是为了缓存已经被解析过的SQL,而是其能被重用,不再解析,share_pool里面不存在已经解析的可用的相同的SQL,对于一个新的,数据库将执行硬解析,这过程很耗资源,若已经存在,则进行的仅仅是软分析(在共享池中寻找相同的SQL),这样消耗的资源大大的减少,所以期望共享一些SQL,并且如果参数设置不大,经常出现ora-04031错误,表示为了解析新的sql,没有足够大的连续空闲空间,这样自然我们期望参数能大一些,但是太大,由于需要维护共享的结构,内存的增大也使得sql的老化代价更高,带来大量的管理的开销,可能导致cpu的严重问题。

一般,在一个较大的系统中,share_pool_size的开销通常应该维持在300M,除非使用大量的存储过程、函数、包、比如oracle erp 这样的应用,可能会达到500M甚至更高。

Data buffer

    在确定了SGA的大小并分配玩了前面部分内存后,其余的都可以分配给这部分内存,通常,在允许的情况下,我们都尝试这是这部分内存更大,这部分内存的作用主要是缓存DB BLOCK,减少甚至避免从磁盘上获取数据,在8i中通常是由db_blocke_buffers* db_block_size来决定大小的,如果设置了buffer_pool_keepbuffer_pool_reycle,则应该加上后边这两部分内存的大小。

9i下部分参数变化

   8i                                  9i

Buffer_pool_keep-----------------------------------------àdb_keep_cache_size

Buffer_pool_recycle--------------------------------------àdb_recycle_cache_size

Db_block_buffers-----------------------------------------àdb_cache_size

 

查看SGA_MAX_SIZE

SQL>show parameters sga_max_size

SQL>alter system set db_cache_size=128000000

SQL>alter system set shared_pool_size=300000000

关于内存的参数调整:

缓冲区命中率:

SQL>select value from v$sysstat where name=’physical reads’;

SQL>select value from v$sysstat where name=’physical reads direct’;

SQL>select value from v$sysstat where name=’physical reads direct (lob)’;

SQL>select value from v$sysstat where name=’consistent gets’;

SQL>select value from v$sysstat where name=’db block gets’;

命中率的计算应该是

   X=physical reads direct + physical reads direct (lob)

命中率=100-(physical reads –x)/(consistent gets + db block gets –x)*100

共享池的命中率

SQL>select sum(pinhits)/sum(pins)*100 “hit radio” from v$librarycache;

关于排序部分

SQL>select name,value from v$sysstat where name like ‘%sort%’;

关于log_buffer

SQL>select name,value from v$sysstat where name in(‘redo entries’,’redo buffer allocation retries’);

 

oracle起动和关闭详解:【上一篇】
[转载]DBA,请小心做事情!:【下一篇】
【相关文章】
  • oracle起动和关闭详解
  • 记录一个Oracle BUG
  • Oracle 常用SQL函数
  • oracle数据库维护12小节
  • oracle 10g install for solaris9 sparc64
  • 在ORACLE中移动数据库文件 大全
  • Oracle数据库系统性能优化策略
  • Computing date differences in Oracle9i
  • oracle点滴
  • ORACLE常用傻瓜問題1000問(之二)
  • 【随机文章】
  • 开机自动运行程序的藏身之处
  • 在C#.NET中使用XML注释
  • 磁盘阵列RAID技术简述
  • 安装apache 2.2.3和php 5.1.5碰到的小问题及解决方法
  • oracle数据库性能监控的SQL(zz)
  • J2ME游戏开发实例讲解(3)
  • ELF动态解析符号过程(修订版)
  • 不用判断语句,求两个数的最大值
  • vim中文手册收藏链接
  • JAVA/JSP学习系列之六(MySQL翻页例子)
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.