Chinaunix首页 | 论坛 | 博客
  • 博客访问: 379737
  • 博文数量: 120
  • 博客积分: 5051
  • 博客等级: 大校
  • 技术积分: 1255
  • 用 户 组: 普通用户
  • 注册时间: 2007-07-03 01:25
文章分类

全部博文(120)

文章存档

2011年(2)

2010年(11)

2009年(28)

2008年(26)

2007年(53)

我的朋友

分类: Oracle

2008-01-02 15:28:55

原文链接:

 

『浅谈SGA』

2005-11-4

1.什么是SGA

在进行ORACLE数据库管理的时候, SGA是一个必须了解的概念,它是ORACLE数据库运行的基础,如何更好设置一些相关的参数,对于ORACLE更有效率的运行都是非常意义。那究竟是什么才是SGA呢?下面就对其做一个简要的介绍。

 要介绍SGA就必须先介绍ORACLE实例,那什么是ORACLE实例呢?ORACLE实例是用来连接ORACLE数据库的途径和方法,由内存和过程结构组成,一般来说,一个实例只用来打开一个ORACLE数据库。

SGA是系统全局区(System Global Area)的简称,是系统分配给ORACLE 的包含一个 ORACLE 实例的数据库的控制信息内存段。它作为ORACLE实例的最基本组成部分,在一个实例启动的时候进行分配。通过下图,我们可以很直观的看出SGA在一次数据库调用中的作用。

    在接下来的文章中,我们就对SGA的基本结构和功能进行一下讨论。

2.SGA的结构及功能

SGA主要包括数据库高速缓存(The database buffer cache),系统重做日志缓存(The redo log buffer),共享池(The shared pool)三部分以及其它一些方面的信息。其结构如下图所示: 

数据高速缓存用来存放从数据文件中读到的数据块的备份,所有该实例的用户进程共享数据库高速缓存重的数据,当数据已在数据库高速缓存中,用户进程就不必从磁盘做读取和写入。

系统重做日志缓存是SGA中一个循环使用的缓存,它保留数据库的变化信息以重做数据库的操作。

共享池包含库缓存(Library cache)和数据字典缓存(Dictionary cache)。库缓存包括共享SQL区,私有SQL区,以及PL/SQL过程和包。

ORACLE 用共享SQL区和私有SQL区来表示所有SQL语句,当ORACLE发现两个用户是执行统一个语句时,就重复使用共享SQL区的数据.当然,每个用户也必须有自己的SQL区。

共享SQL区为单一的或同一的SQL语句建立分析树和执行计划,ORACLE把同一的DML语句通过共享SQL区保存到内存。尤其当许多用户执行同一个应用程序时,在共享区中总保持有一个共享SQL区。

ORACLE分析完一个语句后就从共享池分配内存给它,分配内存的大小要根据语句的复杂程度而定。私有SQL区包含的数据有编译信息,运行缓存等.任何时候产生的SQL语句都有一个私有SQL区,每个用户提交一个SQL语句就有一个独占的SQL区做他的私有SQL区;多个私有SQL区可以拥有同一个共享SQL区。私有SQL区有一个永久区和一个运行区:永久区包含编译信息和其他一些信息,其大小要看语句中涉及的编译信息和列的多少,如:如果一个查询语句中要显示的列很多,那永久区就会较大;运行区包含一些在语句被执行时所需要的信息,永久区的大小受被执行语句的类型,复杂程度以及查询得到的行的多少的影响。一般INSERT, UPDATE, 和 DELETE语句的运行区比SELECT的运行区要小。ORACLE在语句一执行时建立运行区,对INSERT, UPDATE, DELETE语句来说,执行已结束ORACLE就释放运行区,对于检索语句,则要等所有被检索行都被取完才取消运行区。

在数据字典缓存中存放的是数据库的表,视图的信息,数据库的结构,数据库的用户等。ORACLE在分析SQL语句时频繁读取这些数据字典缓存中的数据。

从前面的介绍基本可以看出,SGA对于数据库的运行有着极其重要的作用。如何配置SGA来得到一个比较高的数据库运行效率。是很多数据库管理人员都非常关心的一个问题,下面就针对这个问题进行一些讨论。

3.SGA参数的设置与察看

ORACLE9i以前的版本中,你只能在启动数据库的时候控制ORACLE使用的内存。ORACLE提供了一些INIT.ORA参数来检测SGA的大小。一旦启动了数据库,你将不能再改变SGA的大小和配置。而ORACLE9i的动态SGA特性允许你监控SGA内的物理内存使用,并根据现有的ORACLE数据库的需求调整SGA内存区域。动态SGA特性使得SGA可以以一个较小的容量开始,并根据需要逐渐增加。在ORACLE9i中,动态调整SGA最大值的语句是:alter system set sga_memory_max = 设定内存值。一般来说,这个数值不要超过系统物理内存的50%,设置在1/3较为合适。

ORACLE9i还提供了调整SGA组成部分大小的功能,对于数据库高速缓存是:alter system set db_cache_size=设定值。对于共享池来说是:alter system set shared_pool_size=设定值。

在数据库运行的时候,要如何才能知道现在的SGA分配情况呢?除了我们前面说的show sga外,我们可以通过下面两条语句来监控SGA中的高速缓存和共享池的使用情况。在数据库正常运行的时,在SYS账户下运行下列语句:

1) 高速缓存

SQL>select decode(state,0,''Free'',1,''Read and Modified'',2,''Read and not Modified'',

                         3,''Currently Being READ'',''Other'') state,

  count(*) count

  from x$bh

  group by state;

如果查询结果显示Free的内存数量远远大于Read and Modified的内存,就说明目前高速缓存设置的大了。

2) 共享池

SQL> select sum(pins)  Pins,sum(reloads) Reloads,

           Sum(reloads)/(sum(pins)+sum(reloads))*100 Percentage

    From v$librarycache;

Pins中的值和在此动态性能表中reloads列以及它们的关系, 是SGA中的当前库高速缓存尺寸是否最佳的最好指示。RELOADS应趋于0,PERCENTAGE若>1%,说明高速缓存的成功率太低,需要加大共享池大小来提高成功率。

以上简要介绍了一下ORACLE数据库中SGA的概念和构成,并列举了一些常用的参数察看与设置方法,希望能给大家的日常数据库维护操作提供一些帮助。

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