Oracle 内存分配和调优 总结

Oracle 内存分配和调优 总结
一直都想总结一下oracle内存调整方面的知识,最近正好优化一个数据库内存参数,查找一些资料并且google很多下。现在记录下来,做下备份。

概述:

Oracle 的内存可以按照共享和私有的角度分为系统全局区和进程全局区,也就是 SGA和 PGA(process global area or private global area)。对于 SGA 区域内的内存来说,是共享的全局的,在 UNIX 上,必须为 oracle 设置共享内存段(可以是一个或者多个),因为 oracle 在UNIX 上是多进程;而在 WINDOWS 上 oracle 是单进程(多个线程),所以不用设置共享内存段。PGA 是属于进程(线程)私有的区域。在 Oracle 使用共享服务器模式下(MTS),PGA中的一部分,也就是 UGA 会被放入共享内存 large_pool_size 中。
发张图Oracle内存架构组成,按照图上面的显示可以一目了然关键的参数和参数名称:

Oracle内存架构

对于 SGA 部分,我们通过 sqlplus 中查询可以看到:

SQL> select * from v$sga; 
 
NAME                      VALUE
-------------------- ----------
Fixed Size              1380840
Variable Size        1241517592
Database Buffers     1325400064
Redo Buffers            9613312
SQL> select * from v$sga; 
NAME                      VALUE
-------------------- ----------
Fixed Size              2188768
Variable Size        2603824182
Database Buffers     2872259379
Redo Buffers           20566016
  • Fixed Size:
    Oracle 的不同平台和不同版本下可能不一样,但对于确定环境是一个固定的值,里面存储了 SGA 各部分组件的信息,可以看作引导建立 SGA 的区域。

  • Variable Size :
    包含了 shared_pool_size、java_pool_size、large_pool_size 等内存设置

  • Database Buffers : 指数据缓冲区:
    在 8i 中包 含 db_block_buffer*db_block_size、buffer_pool_keep、buffer_pool_recycle 三 部 分内 存 。
    在 9i 中 包 含 db_cache_size 、db_keep_cache_size、db_recycle_cache_size、db_nk_cache_size。

  • Redo Buffers :
    指日志缓冲区,log_buffer。在这里要额外说明一点的是,对于 v$parameter、v$sgastat、v$sga 查询值可能不一样。v$parameter 里面的值,是指用户在初
    始化参数文件里面设置的值,v$sgastat 是 Oracle 实际分配的日志缓冲区大小(因为缓冲区的分配值实际上是离散的,也不是以 block 为最小单位进行分配的),
    v$sga 里面查询的值,是在 Oracle 分配了日志缓冲区后,为了保护日志缓冲区,设置了一些保护页,通常我们会发现保护页大小大约是 11k(不同环境可能不一样)。

Oracle 内存调优办法

当项目的生产环境出现性能问题,我们如何通过判断那些参数需要调整呢?

检查ORACLE实例的Library Cache命中率:

标准:一般是大于99%

检查方式:

SQL> select 1-(sum(reloads)/sum(pins)) "Library cache Hit Ratio" from v$librarycache;
 
Library cache Hit Ratio
-----------------------
      0.995500931581541

处理措施:
如果Library cache Hit Ratio的值低于99%,应调高shared_pool_size的大小。通过sqlplus连接数据库执行如下命令,调整shared_pool_size的大小:

SQL>alter system flush shared_pool;
SQL>alter system set shared_pool_size=设定值 scope=spfile;

检查ORACLE实例的Data Buffer(数据缓冲区)命中率

标准:一般是大于90%

检查方式:

SQL> select 1 - (phy.value / (cur.value + con.value)) "HIT RATIO"
  2  from v$sysstat cur, v$sysstat con, v$sysstat phy
  3  where cur.name = 'db block gets'
  4  and con.name = 'consistent gets'
  5   and phy.name = 'physical reads';
 
 HIT RATIO
----------
0.97678192

处理措施:
如果HIT RATIO的值低于90%,应调高db_cache_size的大小。通过sqlplus连接数据库执行如下命令,
调整db_cache_size的大小

SQL>alter system set db_cache_size=设定值 scope=spfile

检查ORACLE实例的Dictionary Cache命中率

标准:一般是大于95%

检查方式:

SQL> select 1 - (sum(getmisses) / sum(gets)) "Data Dictionary Hit Ratio"
  2    from v$rowcache;
 
Data Dictionary Hit Ratio
-------------------------
        0.999701677408011

处理措施:
如果Data Dictionary Hit Ratio的值低于95%,应调高shared_pool_size的大小。通过sqlplus连接数据库执行如下命令,调整shared_pool_size的大小:

SQL>alter system flush shared_pool;
SQL>alter system set shared_pool_size=设定值 scope=spfile;

检查ORACLE实例的Log Buffer命中率

标准:一般是小于1%

检查方式:

SQL> select (req.value * 5000) / entries.value "Ratio"
  2    from v$sysstat req, v$sysstat entries
  3   where req.name = 'redo log space requests'
  4     and entries.name = 'redo entries';
 
     Ratio
----------
0.08082257

处理措施:
如果Ratio高于1%,应调高log_buffer的大小。通过sqlplus连接数据库执行如下命令,调整log_buffer的大小:

SQL>alter system set log_buffer=设定值 scope=spfile;

检查undo_retention

标准:undo_retention 的值必须大于max(maxquerylen)的值

检查方式:

SQL> col undo_retention format a30
SQL> select value "undo_retention" from v$parameter where name='undo_retention';
 
undo_retention
------------------------------
900
SQL> select max(maxquerylen) From v$undostat Where begin_time>sysdate-(1/4);
 
MAX(MAXQUERYLEN)
----------------
            1253

处理措施:
如果不满足要求,需要调高undo_retention 的值。通过sqlplus 连接数据库执行如下命
令,调整undo_retention 的大小:

SQL>alter system set undo_retention= 设定值 scope=spfile;
SQL> alter system set undo_retention=2048 scope=spfile;
 System altered

简单查看ORACLE的连接情况和内存使用情况

查看连接Oracle的所有机器的连接数

-- 查看连接Oracle的所有机器的连接数 
SELECT MACHINE,COUNT(*) FROM V$SESSION GROUP BY MACHINE;
SQL> SELECT MACHINE,COUNT(*) FROM V$SESSION GROUP BY MACHINE;
 
MACHINE                                                            COUNT(*)
---------------------------------------------------------------- ----------
WIN-Q9I6NL3EJCU                                                          28
USER-20151208SP\USER-20151208SP                                          14
WORKGROUP\WIN-Q9I6NL3EJCU                                                 6
WORKGROUP\USER-20151208SP                                                 7
IIS APPPOOL\WIN-Q9I6NL3EJCU                                              14

查看连接Oracle的所有机器的连接数和状态

-- 查看连接Oracle的所有机器的连接数和状态
SELECT MACHINE,STATUS,COUNT(*) FROM V$SESSION GROUP BY MACHINE,STATUS ORDER BY STATUS;
SQL> SELECT MACHINE,STATUS,COUNT(*) FROM V$SESSION GROUP BY MACHINE,STATUS ORDER BY STATUS;
 
MACHINE                                                          STATUS     COUNT(*)
---------------------------------------------------------------- -------- ----------
WIN-Q9I6NL3EJCU                                                  ACTIVE           26
WORKGROUP\USER-20151208SP                                        ACTIVE            1
WORKGROUP\WIN-Q9I6NL3EJCU                                        ACTIVE            1
IIS APPPOOL\WIN-Q9I6NL3EJCU                                      INACTIVE         13
USER-20151208SP\USER-20151208SP                                  INACTIVE         14
WIN-Q9I6NL3EJCU                                                  INACTIVE          4
WORKGROUP\USER-20151208SP                                        INACTIVE          6
WORKGROUP\WIN-Q9I6NL3EJCU                                        INACTIVE          5
 
8 rows selected

Oracle的PGA、SGA和process count

-- Oracle的PGA、SGA和process count
SELECT 'SGA' AS NAME,ROUND(SUM(VALUE)/1024/1024,2)||'M' AS "SIZE(M)" FROM V$SGA
UNION
SELECT 'PGA' AS NAME,ROUND(VALUE/1024/1024,2)||'M' AS "SIZE(M)" FROM V$PGASTAT WHERE NAME='TOTAL PGA ALLOCATED'
UNION
SELECT 'TOTAL' AS NAME,((SELECT ROUND(SUM(VALUE)/1024/1024,2) FROM V$SGA)+(SELECT ROUND(VALUE/1024/1024,2) FROM V$PGASTAT WHERE NAME='TOTAL PGA ALLOCATED'))||'M' AS "SIZE(M)" FROM DUAL
UNION
SELECT NAME,TO_CHAR(VALUE) FROM V$PGASTAT WHERE NAME='PROCESS COUNT';
SQL> SELECT 'SGA' AS NAME,ROUND(SUM(VALUE)/1024/1024,2)||'M' AS "SIZE(M)" FROM V$SGA
  2  UNION
  3  SELECT 'PGA' AS NAME,ROUND(VALUE/1024/1024,2)||'M' AS "SIZE(M)" FROM V$PGASTAT WHERE NAME='TOTAL PGA ALLOCATED'
  4  UNION
  5  SELECT 'TOTAL' AS NAME,((SELECT ROUND(SUM(VALUE)/1024/1024,2) FROM V$SGA)+(SELECT ROUND(VALUE/1024/1024,2) FROM V$PGASTAT WHERE NAME='TOTAL PGA ALLOCATED'))||'M' AS "SIZE(M)" FROM DUAL
  6  UNION
  7  SELECT NAME,TO_CHAR(VALUE) FROM V$PGASTAT WHERE NAME='PROCESS COUNT';
 
NAME                                                             SIZE(M)
---------------------------------------------------------------- -----------------------------------------
SGA                                                              52245.7M
TOTAL                                                            M
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342