内存结构与动态内存管理

内存是影响数据库性能的重要因素。
  oracle8i使用静态内存管理,即,SGA内是预先在参数中配置好的,数据库启动时就按这些配置来进行内在分配,oracle10g引入了动态内存管理,即在数据库运行过程中,内存大小可以在线修改与自动配置。
  oracle数据库的内存可以分为:系统全局区、程序全局区、排序区、大池、java池。
一、系统全局区(SGA)
  系统全局区的数据被多个用户共享。当数据库实例启动时,系统全局区内存被自动分配。SGA按作用的不同,又分为:数据缓冲区、日志缓冲区、共享池。
1.数据缓冲区
  数据缓冲区用于存储从磁盘数据文件中读入的数据,供所有用户共享。修改、插入的数据存储在数据缓冲区中,修改完成或DBWR进程执行时,数据被写入数据文件。
  几个概念:
LRU:最近最少使用,系统按这个原则对缓冲区中的数据进行替换。
Dirty:脏数据,指修改后还没有写到数据文件中的数据。
  在9i之前,数据缓冲区的大小是由DB_BLOCK_BUFFER确定,之后的版本中,是由参数DB_CACHE_SIZE及DB_nK_CACHE_SIZE确定。不同的表空间可以使用不同的块大小,在创建表空间中加入参数BLOCKSIZE指定该表空间数据块的大小,如果指定的是2k,则对应的缓冲区大小为DB_2K_CACHE_SIZE参数的值,如果指定的是4k,则对应的缓冲区大小为DB_4K_CACHE_SIZE参数的值,以此类推。如果不指定BLOCKSIZE,则默认为参数DB_BLOCK_SIZE的值,对应的缓冲区大小是DB_CACHE_SIZE的值。
  缓冲区的设置对性能影响是很突出的。设一个查询要读取的数据块数为A,能够从缓冲区读取到的数据块数为C,需要从磁盘读取的数据块数为D,那么A+C+D,则C/A称为数据缓冲区的命中率。以下语句计算数据缓冲区的命中率:
SQL>SELECT A.VALUE+B.VALUE "LOGICAL_READS",C.VALUE "PHYS_READS",
    ROUND(100*((A.VALUE+B.VALUE)-C.VALUE)/(A.VALUE+B.VALUE)) "BUFFER HIT RATIO"
    FROM V$SYSSTAT A,V$SYSSTAT C 
    WHERE A.STATICSTIC#=38 AND B.STATISTIC#=39 AND C.STATICSTIC#=40
一般要求命中率在90%以下,如果命中率太低,就应适当调整数据缓冲区的大小。

2.日志缓冲区
  日志缓冲区用于缓冲事务日志,在适当的时候再由LGWR进程写入日志文件。日志缓冲区的大小由参数LOG_BUGGER设定。
  日志在进入日志缓冲区时,如果日志缓冲区过小而没有空闲空间,就要等待LGWR将缓冲区中原有的日志写入日志文件以腾出空闲空间。如果有足够的空闲空间,则无需等待,直接写入日志缓冲区中。那么这个 等待的次数/总次数(等待+非等待) 就称为日志缓冲区的失败率,可以通过以下语句计算:
sql>select name,gets,misses,immediate_get,immediate_misses,
    decode(gets,0,0,misses/gets*100 ratio1,
    decode(immediate_gets+immdiate_misses,0,0,immediate_misses/(immdiate_gets+immediate_misses)*100) ratio2
    from v$latch where name in ('redo allocation','redo copy');
  显然,失败率也是影响性能的重要因素,就要实际情况调整log_buffer的大小。

3.共享池
  共享池是对sql,pl/sql程序进行语法分析,编译,执行的内存区域。包括:库缓冲区(library cache),数据字典缓冲区(data dictinary cache),用户全局区(user global area)三个部分。
  共享池的大小由参数shared_pool_size设定。
  查询数据字典的成功与失败次数:
sql>select sum(gets) "dictionary gets",
           sum(getmisses) "dictionary cache getmisses",
           from v$rowcache
   计算共享池记取数据字典的成功率:
sql>select parameter,gets,getmisses,getmisses/(gets+getmisses)*100 "miss ratio",(1-sum(getmisses)/sum(gets)+sum(getmisses))))*100 "hit ratio" from v$rowcache where gets+getmisses<>0 group by parameter,gets,getmisses;
  计算缓存的失败率,结果应小于1%:
sql>select sum(pins) "total pins",sum(reloads) "total reloads",
           sum(reloads)/sum(pins)*100 libcahe from v$librarycache;

以上分析了SGA的三个部分,要查看SGA的总大小或空闲空间,使用比率,如下:
sql>select * from v$sga
sql>select name,sgasize/1024/1024 "allocated(m)",bytes/1024 "空闲空间百分比(%)" from (select sum(bytes) sgasize from sys.v_$sgastat) s,sys.v_sgastat f where f.name='free mamory';

二、程序全局区
  程序全局区(PGA)是包含单个用户或服务器数据的控制信息的内存区域。是在用户进程连接到oracle数据库并创建一个会话时,由oracle自动分配的,它是非共享区,主要用于在编程时存储变量与数组。会话结束时,PGA被释放。

三、排序区
  排序区用于sql的order by。oracle优先使用排序区进行排序,如果内存不够,oracle自动使用临时表空间进行排序。
  参数sort_area_size用于设置排序区的大小。

四、大池
  大池用于数据库备份工具-RMAN。
  大池的大小由参数large_pool_size确定。

五、java池
  从8i开始,oracle增加了对java的支持,所以系统提供了java池,其大小由参数java_pool_size设定。

六、oracle10g的自动共享内存管理
1.什么是自动共享内存管理?

  在10g以前的版本中,SGA的各个部分,share_pool_size,db_cache_size等需要由管理员手动设置大小,当数据库负荷太大时,若没有调整这些参数的大小,就会产生“无法分配内存”的错误。在10g中,将参数statistics_level设置为typecal 或all,再使用新参数SGA_TARGET设置SGA内存区的部大小即可,无需定义每个参数的大小,系统会根据需要自动在多个组件之间分配内存大小。

2.自动共享内存管理时,设置SGA各部分内存参数的最小值限制
  如果同时设置了SGA_TARGET和各内存参数,如:
SGA_TARGET=300M
SHARED_POOL_SIZE=32M
DB_CACHE_SIZE=90M
则表示共享池和数据缓冲区至少会分配32M和90M内存,剩下的可由系统自动分配的内存为:
300-32-90=172M

3.手动内存管理转换为自动管理
  只要设置新参数SGA_TARGET即可,如:
SGA_TARGET=1000M
   在自动内存管理模式下,如果数据库使用SPFILE,那么在数据库关闭后,系统会将上一次数据库关闭时的内存分配状态记录下来。因此,如果是自动内存管理,最好使用SPFILE而非PFILE。

oracle结构-内存结构与动态内存管理的更多相关文章

  1. Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组

    版权声明:本文出自阿钟的博客,转载请注明出处:http://blog.csdn.net/a_zhon/. 目录(?)[+] 一:什么是静态内存什么又是动态内存呢? 静态内存:是指在程序开始运行时由编译 ...

  2. C程序的内存分配及动态内存

    1.程序内存的分配 一个由C/C++编译的程序占用的内存分为以下几个部分:1)栈区(stack) — 由编译器自动分配释放 , 存放为运行函数而分配的局部变量. 函数参数. 返回数据. 返回地址等. ...

  3. C++_类和动态内存分配1—动态内存和类

    静态类成员 num_strings成员声明为静态存储类.静态类成员有一个特点:无论创建了多少对象,程序都只创建一个静态类变量副本.也就是说,类的所有对象共享一个静态成员.num_strings成员可以 ...

  4. C++微专业课程辅导(内存模型和动态内存)

    “除了静态内存和栈内存之外,每个程序还拥有一个内存池.这部分空间被称作自由空间(free store)或堆(heap).程序用堆来存储动态分配(dynamically allocate)的对象”——& ...

  5. 从五大结构体,带你掌握鸿蒙轻内核动态内存Dynamic Memory

    摘要:本文带领大家一起剖析了鸿蒙轻内核的动态内存模块的源代码,包含动态内存的结构体.动态内存池初始化.动态内存申请.释放等. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列九 动态内存Dyna ...

  6. uCGUI动态内存管理

    动态内存的堆区 /* 堆区共用体定义 */ typedef union { /* 可以以4字节来访问堆区,也可以以1个字节来访问 */ ]; /* required for proper aligne ...

  7. FreeRTOS 动态内存管理

    以下转载自安富莱电子: http://forum.armfly.com/forum.php 本章节为大家讲解 FreeRTOS 动态内存管理,动态内存管理是 FreeRTOS 非常重要的一项功能,前面 ...

  8. C++动态内存管理与源码剖析

    引言 在本篇文章中,我们主要剖析c++中的动态内存管理,包括malloc.new expression.operator new.array new和allocator内存分配方法以及对应的内存释放方 ...

  9. c++动态内存管理与智能指针

    目录 一.介绍 二.shared_ptr类 make_shared函数 shared_ptr的拷贝和引用 shared_ptr自动销毁所管理的对象- -shared_ptr还会自动释放相关联对象的内存 ...

  10. 【C++】C++中的动态内存解析

    目录结构: contents structure [-] 动态内存和智能指针 使用shared_ptr管理内存 使用new直接管理内存 shared_ptr和new结合使用 unique_ptr we ...

随机推荐

  1. 洛谷 P1203 [USACO1.1]坏掉的项链Broken Necklace

    坏掉的项链Broken Necklace 难度:★ Code: #include <iostream> #include <cstdio> #include <cstri ...

  2. iOS - KVO 简单应用

    KVO(键值监听)全称 Key Value Observing.使用KVO可以实现视图组件和数据模型的分离,视图作为监听器,当模型的属性值发生变化后,监听器可以做相应的处理.KVO的方法由NSKeyV ...

  3. Android Framework中的Application Framework层介绍

    Android的四层架构相比大家都很清楚,老生常谈的说一下分别为:Linux2.6内核层,核心库层,应用框架层,应用层.我今天重点介绍一下应用框架层Framework,其实也是我自己的学习心得. Fr ...

  4. 看动画,秒懂人工智能&物联网

  5. 通过Jenkins调用自动部署war包及jar包到服务器上的Shell脚本

    1)部署war包#!/bin/bashif [ id>0];then echo"stopproject" kill −9 idelse echo "project ...

  6. img标签src资源无法加载,报net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION错

    html代码: chrome和360浏览器均报错,系统自带IE.Firefox浏览器没有问题 原因:加载的资源名含有半角逗号(,)或者别的特殊符号 解决办法:后台给资源名加上双引号("&qu ...

  7. 洛谷 P1903 【模板】分块/带修改莫队(数颜色)

    题目描述 墨墨购买了一套N支彩色画笔(其中有些颜色可能相同),摆成一排,你需要回答墨墨的提问.墨墨会像你发布如下指令: 1. Q L R代表询问你从第L支画笔到第R支画笔中共有几种不同颜色的画笔. 2 ...

  8. 发现知乎的一个Bug,并且我绕过了此Bug,沾沾自喜中...

    发现问题 在知乎点击修改头像,上传图片时发现一片空白.凭着程序员的直觉,第一反应时看下控制台是否有报错.果然发现如下: Refused to load the image 'data:image/jp ...

  9. UVA 1599, POJ 3092 Ideal Path 理想路径 (逆向BFS跑层次图)

    大体思路是从终点反向做一次BFS得到一个层次图,然后从起点开始依次向更小的层跑,跑的时候选则字典序最小的,由于可能有多个满足条件的点,所以要把这层满足条件的点保存起来,在跑下一层.跑完一层就会得到这层 ...

  10. 协议(Protocol)与委托代理(Delegate)

    协议(Protocol)的作用: 1. 规范接口,用来定义一套公用的接口: 2. 约束或筛选对象. 代理(Delegate): 它本身是一种设计模式,委托一个对象<遵守协议>去做某件事情, ...