Oracle内存结构研究的相关内容介绍

数据库 Oracle
在《Oracle内存结构研究-PGA篇》一文中有所提及SGA是共享的相关内存区,本文也是对其相关的实际应用的介绍,希望你会有所收获。

我曾在《Oracle内存结构研究-PGA篇》一文中看到,PGA只是一个服务器的进程专门使用的私有的相关内存区,但是SGA却是共享的相关内存区。所以下文中就有相关内容的提及,望你会从中有所感悟。

一、SGA由多个部分组成:

1, 固定SGA(Fixed SGA)

 

2, 块缓冲区(Db cache)

 

3, 重做日志缓冲区(Redo log buffer)

 

4, Java池(Java pool)

 

5, 大池(Large pool)

 

6, 共享池(Shared pool)

 

7, 流池(Stream pool)

 

有如下参数控制共享池相关组件大小:

1, JAVA_POOL_SIZE:控制Java池大小。

 

2, SHARED_POOL_SIZE:9i中控制共享池中占用***的部分,10g以上控制共享池大小。

 

3, LARGE_POOL_SIZE:控制大池大小。

 

4, DB_*K_CACHE_SIZE:控制不同块大小的缓冲区大小。

 

5, LOG_BUFFER:控制重做日志缓冲区大小。

 

6, SGA_TARGET:10g以上控制自动SGA内存管理的总内存大小。

 

7, SGA_MAX_SIZE:控制SGA可以达到的***大小,改变需重启数据库。

 

下面将详细介绍各个部分的作用和推荐设置。

 二、SGA各组件作用

1, 固定SGA:

 

顾名思义,是一段不变的内存区,指向SGA中其他部分,Oracle通过它找到SGA中的其他区,可以简单理解为用于管理的一段内存区。

 

2, 块缓冲区:

在Oracle内存结构研究-SGA篇中查询时,Oracle会先把从磁盘读取的数据放入内存,以后再查询相关数据时不用再次读取磁盘。插入和更新时,Oracle会现在该区中缓存数据,之后批量写到硬盘中。通过块缓冲区,Oracle可以通过内存缓存提高磁盘的I/O性能。

 

块缓冲区中有三个区域:

 

默认池(Default pool):所有数据默认都在这里缓存。

 

保持池(Keep pool):用来缓存需要多次重用的数据。

 

回收池(Recycle pool):用来缓存很少重用的数据。

 

原来只有一个默认池,所有数据都在这里缓存。这样会产生一个问题:大量很少重用的数据会把需重用的数据“挤出”缓冲区,造成磁盘I/O增加,运行速度下降。后来分出了保持池和回收池根据是否经常重用来分别缓存数据。

 

这三部分内存区需要手动确定大小,并且之间没有共享。例如:保持池中已经满了,而回收池中还有大量空闲内存,这时回收池的内存不会分配给保持池。

 

9i开始,还可以设置db_nk_cache。9i之前数据库只能使用相同的块大小。9i开始同一个数据库可以使用多种块大小(2KB,4KB,8KB,16KB,32KB),这些块需要在各自的db_nk_cache中缓存。如果为不同的表空间指定了不同的块大小,需要为其设置各自的缓冲区。

 

3, 重做日志缓冲区(Redo log buffer):

数据写到重做日志文件之前在这里缓存,在以下情况中触发:

 

每隔3秒

 

缓存达到1MB或1/3满时

 

用户提交时

 

缓冲区的数据写入磁盘前

 

4, Java池(Java pool):

在数据库中运行Java代码时用到这部分内存。例如:编写Java存储过程在服务器内运行。需要注意的是,该内存与常见的Java编写的B/S系统并没关系。用JAVA语言代替PL/SQL语言在数据库中写存储过程才会用到这部分内存。

 

5, 大池(Large pool):

下面三种情况使用到大池:

 

并行执行:存放进程间的消息缓冲区

 

RMAN:某些情况下用于磁盘I/O缓冲区

 

共享服务器模式:共享服务器模式下UGA在大池中分配(如果设置了大池)

 

6, 共享池(Shared pool)

共享池是SGA中最重要的内存段之一。共享池太大和太小都会严重影响服务器性能。

 

SQL和PL/SQL的解释计划、代码,数据字典数据等等都在这里缓存。

 

SQL和PL/SQL代码在执行前会进行“硬解析”来获得执行计划及权限验证等相关辅助操作。“硬解析”很费时间。对于响应时间很短的查询,“硬解析”可以占到全部时间的2/3。对于响应时间较长的统计等操作,“硬解析”所占用的时间比例会下降很多。执行计划及所需的数据字典数据都缓存在共享池中,让后续相同的查询可以减少很多时间。

 

不使用“绑定变量”导致:

 

系统需要花费大量的资源去解析查询。

 

共享池中的代码从不重用,系统花费很大代价管理这部分内存。

 

关于共享变量的优缺点讨论已经超过了这篇文章的范畴,简单来讲,响应时间短的查询要使用共享变量,响应时间长的统计不使用共享变量。

 

需要注意的是,SHARED_POOL_SIZE参数在9i中控制共享池中占用***的部分,10g以上控制共享池总大小。

 

7, 流池(Stream pool)

9iR2以上增加了“流”技术,10g以上在SGA中增加了流池。流是用来共享和复制数据的工具。#p#

 

 三、SGA设置

没有通用的设置,所有Oracle内存结构设置都要根据系统的负载、业务需求和硬件环境来进行调整。这里只是总结出大体的设定,避免因SGA设置不当引起的问题。

 

1,自动SGA内存管理

在Oracle 10g中引入了自动SGA内存管理特性,DBA可以设定SGA_TARGET告诉Oracle可用的SGA内存为多大,由Oracle根据系统负载来动态调整各组件大小,相应的数定会保存在控制文件中,使数据库重启后也记得各组件大小。

 

需要注意一下几点:

 

要使用自动SGA内存管理,STATISTICS_LEVEL参数必须设为TYPICAL或ALL,系统自动收集相应的信息用来动态调整SGA设定。

 

可以设定某个组件的值,Oracle使用此值为该组件的最小大小

 

可动态调整的参数:

DB_CACHE_SIZE,SHARED_POOL_SIZE,LARGE_POOL_SIZE,JAVA_POOL_SIZE。

 

需手动设置的参数:

 

LOG_BUFFER,STREAMS_POOL,DB_NK_CACHE_SIZE,DB_KEEP_CACHE_SIZE,DB_RECYCLE_CACHE_SIZE。

 

2,手动SGA内存管理

1) 32bit和64bit限制

 

在32位的操作系统中,Oracle***可用内存为1.75g,也就是说SGA+PGA<=1.75g,超过这一限制的内存将不会被Oracle用到。

 

32位的Oracle可以装到64位的操作系统上,64位的Oracle不可以装到32位的操作系统上。

 

2) 查看Oracle版本:

 

  1. SQL> select * from v$version;  
  2. BANNER  
  3. Oracle Database 10g Enterprise Edition Release
     10.2.0.1.0 - Prod  
  4. PL/SQL Release 10.2.0.1.0 - Production  
  5. CORE 10.2.0.1.0 Production  
  6. TNS for 32-bit Windows: Version 10.2.0.1.0 - 
    Production  
  7. NLSRTL Version 10.2.0.1.0 – Production 

 

 

3) 各组件设置:

JAVA_POOL_SIZE:如果没用到数据库端java的系统,30MB足够。

 

LOG_BUFFER:默认为MAX(512KB,128KB*CPU个数)。一般系统1MB足够,运行大型事务的系统可以设为2MB,让1/3满写入日志文件时可以继续写入缓冲,再大也没有意义。

SHARED_POOL_SIZE:过大过小都会严重影响系统性能,1GB内存可以设为100MB,2GB内存可设为150MB,4GB内存可设为300MB。共享池命中过低首先要调整的是应用程序而不是扩大共享池。使用绑定变量可以减少共享池需求、提高命中率,减少共享池管理负担和LATCH竞争。

LARGE_POOL_SIZE:使用专用服务模式可设为30MB,除非必要,不然不建议使用共享服务器模式。

DB_CACHE_SIZE:除去上述内存外其他可用内存都分配给该区域。

总结

32位Oracle:

 

1G内存:SHARED_POOL_SIZE=100MB,DB_CACHE_SIZE=0.5GB;

 

2G内存:SHARED_POOL_SIZE=150MB,DB_CACHE_SIZE=1.25GB;

 

64位Oracle

4G内存:SHARED_POOL_SIZE=200MB,DB_CACHE_SIZE=2.5GB;

 

8G内存:SHARED_POOL_SIZE=400MB,DB_CACHE_SIZE=5GB;

 

12G内存:SHARED_POOL_SIZE=500MB,DB_CACHE_SIZE=8GB

 

再次强调,以上只是避免因Oracle内存结构中SGA设置不当引起问题的大体设置,需要根据具体的系统负载和业务逻辑结合Stackpack等工具细调。

【编辑推荐】

  1. Oracle绑定变量如何提升相关效率
  2. Oracle实现跨服务器操作详解
  3. Oracle索引聚簇表的数据加载中两个组成部分
  4. Oracle体系结构中基本概念,数据库
  5. 用Oracle绑定变量替代sql语句里常量
责任编辑:佚名 来源: 互联网
相关推荐

2010-04-08 10:02:15

Oracle体系结构

2010-02-01 09:18:49

C++函数指针

2010-03-25 11:30:25

2010-04-08 10:33:08

Oracle数据库

2010-01-27 16:56:42

Android内核

2010-03-26 18:31:50

Python前景Python库

2009-11-26 14:33:58

Cisco路由器IOS

2010-03-25 14:27:52

Python语法

2010-01-13 16:15:47

VB.NET消息队列

2010-06-17 16:12:43

WAP协议

2010-01-28 16:19:39

Android She

2010-07-20 13:07:13

SQL Server存

2010-04-16 15:57:54

Oracle 10g

2010-06-08 17:30:56

IPv6协议栈

2010-03-22 14:05:08

Python字符串

2010-02-25 17:57:26

WCF服务合同

2010-01-28 16:30:16

Android数据传递

2010-02-26 09:50:57

WCF传输安全机制

2010-01-22 18:24:28

VB.NET重构

2010-02-26 13:21:42

WCF通道形状
点赞
收藏

51CTO技术栈公众号