`
Turandot
  • 浏览: 51517 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Oracle 内存结构

阅读更多

Oracle 内存结构

 

  Oracle的3个主要的内存结构:

  • 系统全局区  (System Global Area, SGA):这是一个很大的共享内存段,几乎所有的Oracle进程都要访问这个区 域
  • 进程全局区  (Porcess Global Area, PGA):这是一个进程或线程专有的内存,其他的进程/线程不能访问。
  • 用户全局区  (User Global Area, UGA):这个区域与特定的会话相关联。它可能在SGA中分配,也可能在PGA中分配,取决于是用专用服务器还是共享服务器来连接数据库。如果使用专用服务器,UGA在PGA中分配,如果使用共享服务器,UGA在SGA中分配。

      PGA是特定于进程的一段内存。这是一个操作系统或线程专用的内存,不允许系统中的其他线程或进程访问。PGA绝对不会在Oracle的SGA中分配,而总是在进程或线程在本地分配。

 

     UGA就是你的会话状态。会话总能访问这部分内存。

 

     SGA是一组共享的内存结构,被所有服务器进程和后台进程使用,所以也叫全局共享区。
它由以下部分构成:数据库高速缓冲区、日志缓冲区、共享池、JAVA池、大池和流池。它的最大尺寸由SGA_MAX_SIZE控制。

      数据高速缓冲区(Database Buffer Cache):用于存放从数据文件读取的数据块,由初始化参数db_catch_size决定。buffer cache可以分成Default  、Keep和Recycle三个部分。Keep池存放持久存放的数据,Recycle池存放经常一次性使用的数据,而Default池一般用于当数据不指定存在在前2者的时候的存放地,一般我们的表都是存放于Default池的。除非你在建表的时候指定 Store(buffer_pool keep) or Store(buffer_pool recycle)。他们的大小由db_keep_cache_size 和db_recycle_cache_size参数指定。  

     在管理buffer cache的时候,一般使用2个列表--LRU LIST 和 Dirty LIST (write list 或者CheckPoint Queue)。各种List上面存放的是指向实际buffer的指针。一般读取的数据时存放在 LRU list上的,修改过后的数据被标识为Dirty,被转移到Dirty List上,并且会被DBWR写到数据文件中。       

      模拟下oracle进程使用高速缓冲区的过程:一个sql语句发过来,首先在高速缓冲区的LRU LIST面寻找有没要的数据,如果找到了,直接返回;反之,就需要把数据从数据文件写入到高速缓冲区中的LRU LIST。首先在LRU里面寻找有没free buffer的空间,如果有,直接把数据从数据文件写入到高速缓冲区的LRU LIST 指定的buffer里面,同时它还会将扫描到的修改过的buffer移动到Dirty List里面。如果扫描LRU超过一个阈值,一般为40%还没找到足够的free buffer,就要通知DBWRdirty list里面指向的buffer写到数据文件里面,腾出空间给LRU LIST,然后把数据填到刚新增的free buffers里。 这里可以看出,如果你的高速缓冲区很小的,不停地写写,造成很大I/O开销。
 

    日志缓冲区(Redo Log Buffer): 用于存放日志条目,日志条目就是记录对数据的改变。当这块区域用光时,后台进程LGWR把日志条目写到磁盘上的联机日志文件中。它由初始化参数log_buffer决定大小。同样的道理下,日志缓冲区应该稍微大点,特别是有长时间运行的事务的时候,可以大量减少I/O。

 

    共享池(Shared Pool):用于存放SQL语句、PL/SQL代码、数据字典、资源锁和其他控制信息。它由初始化参数SHARED_POOL_SIZE控制其大小。

   它包含以下几个缓冲区:
      库缓冲区(Library Cache):存放解析并且执行过的SQL和PL/SQL代码。可以用于共享解析树和执行计划,加快语句执行速度。共享SQL区:存放SQL语句的解析树和执行计划;私有SQL区:这部分存放的东西只被会话私有,一般包含一些变量,会话参数等。数据字典缓冲区(Data Dictionary Cache):存放一些被频繁访问的数据字典信息,防止过多对系统表空间进行访问。以行的形式存放数据,所以又叫行存储区。

 

     大池(Large Pool):一般用于数据库的备份和恢复、并行查询、共享服务器模式下的会话内存。不建立大池,所需要的内容要从共享池或者PGA内获取。它由初始化参数large_pool_size控制.

 

    JAVA池(JAVA Pool):用于支持在数据库中运行java代码,一般由java_pool_size控制。

 

     流池(Stream Pool):加强对流的支持,一般由stream_pool_size控制。

 

查询SGA区的情况:
    1.show SGA
    2.select * from v$sga
     
     NAME                      VALUE
     -------------------- ----------
     Fixed Size              1249488
     Variable Size         159387440
     Database Buffers      281018368
     Redo Buffers            7135232


    这里的Fixed Size表示固定区域,存储SGA各个组件的信息。不能修改大小。
               Variable Size表示可变区域,比如共享池、java池、大池等。‘
              Database Buffers表示数据库高速缓冲区。
               Redo Buffers表示日志缓冲区。
          

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics