Oracle 内存分配与调整.

合集下载

关于Oracle服务器性能调整攻略

关于Oracle服务器性能调整攻略

Oracle服务器是高度可调的数据库系统,它提供了许多特性,正确地设置和调整可以有效提高系统性能,因此,对系统进行调整是数据库管理员的主要责任。

由于应用设计人员很少或根本不会给数据库管理人员提供必要的信息,因此只能采用对已有应用系统影响最小的调整方式:重新分配内存、调整磁盘I/O来提高性能。

调整内存Oracle服务器将信息存储在两个地方:内存、磁盘。

因为内存的存取比磁盘的存取快得多,为了获得最佳的性能,总是希望将数据尽可能多地放在内存供用户读取。

可是系统内存资源是有限的,不可能将所有数据放在内存,因此,要在现有内存资源的基础上,通过调整内存分配来获得尽可能好的性能。

调整内存的分配,实际上就是对Oracle数据库内存结构分配恰当尺寸的可用内存。

为了取得好的效果,调整要按如下顺序进行:调整操作系统、调整共享池、调整缓冲区高速缓存。

由于后面调整所作的改变可能需要对前面的调整再次进行判断和调整,因此,调整的过程可能需要若干次循环。

调整操作系统操作系统运行得好,是Oracle调整内存分配的基础,其方法如下:减少调页或交换过度的调页或交换必定会降低操作系统的性能。

可以用操作系统提供的实用程序进行监控,如发现有过度的调页或交换,则说明系统总内存存放不下已经分配在内存中的信息。

解决的办法是增加系统内存总量,或减少已经分配的内存量。

调整系统全局区(SGA)SGA是Oracle数据库存放系统信息的一块区域,由所有的服务器和客户进程共享,主要由以下四部分组成:数据高速缓冲区、字典缓冲区、重演日志缓冲区、共享SQL池。

建SGA的目的是为了将数据放在内存以便快速存取,如果SGA过大内存放不下,就要被交换到磁盘,产生过度交换或调页,数据存取就快不了。

在大多数系统里,过度调页的坏处比大SGA 的好处对性能的影响要大得多,因此宁可SGA小些,也要保证整个SGA能被内存容下。

可利用SQL*DBA语句SHOW SGA来查看分配了多少内以及每个内部结构的大小。

Oracle数据库内存参数调优技术

Oracle数据库内存参数调优技术

Oracle数据库内存参数调优技术的个人总结近来公司技术,研发都在问我关于内存参数如何设置可以优化Oracle的性能,所以抽时间整理了这篇文档,以做参考。

目的:希望通过整理此文档,使公司同事对oracle内存结构有一个全面的了解,并在实际的工作中灵活应用,使oracle的内存性能达到最优配置,提升应用程序反应速度,并进行合理的内存使用。

实例结构oracle实例=内存结构进程结构oracle实例启动的过程,其实就是oracle内存参数设置的值加载到内存中,并启动相应的后台进程进行相关的服务过程。

进程结构oracle进程=服务器进程用户进程几个重要的后台进程:DBWR:数据写入进程.LGWR:日志写入进程.ARCH:归档进程.CKPT:检查点进程(日志切换;上一个检查点之后,又超过了指定的时间;预定义的日志块写入磁盘;例程关闭,DBA强制产生,表空间offline)LCKn(0-9):封锁进程.Dnnn:调度进程.内存结构(我们重点讲解的)内存结构=SGA(系统全局区) PGA(程序全局区)SGA就是我们所说的内存调优的主要对象。

我们重点就是设置SGA原则:SGA PGA OS使用内存<总物理RAM1、SGA系统全局区.(包括以下五个区)A、数据缓冲区:(db_block_buffers)存储由磁盘数据文件读入的数据。

大小: db_block_buffers*db_block_sizeOracle9i设置数据缓冲区为:Db_cache_size原则:SGA中主要设置对象,一般为可用内存40%。

B、共享池:(shared_pool_size):数据字典,sql缓冲,pl/sql语法分析.加大可提速度。

原则:SGA中主要设置对象,一般为可用内存10%C、日志缓冲区:(log_buffer)存储数据库的修改信息.原则:128K ---- 1M 之间,不应该太大D 、JAVA池(Java_pool_size)主要用于JAVA语言的开发.原则:若不使用java,原则上不能小于20M,给30M通常就够了E、大池(Large_pool_size)如果不设置MTS,主要用于数据库备份恢复管理器RMAN。

Oracle数据库内存优化操作说明

Oracle数据库内存优化操作说明

千里之行,始于足下。

Oracle数据库内存优化操作说明Oracle数据库的内存优化操作主要包括以下几个方面:1. 调整SGA和PGA的大小:- SGA(System Global Area)是Oracle数据库实例使用的内存区域,包括数据库缓存、共享池等。

可以通过修改SGA_TARGET和SGA_MAX_SIZE等参数来调整SGA的大小。

- PGA(Program Global Area)是每个进程独自使用的内存区域,包括排序区、hash区等。

可以通过修改PGA_AGGREGATE_TARGET参数来调整PGA的大小。

2. 合理配置各个内存区域的大小:- 根据具体的数据库负载情况,可以调整SGA组件的大小,如缓冲区大小、共享池大小等,以提高数据库的性能。

- 合理配置PGA区域的大小,可以减少排序操作的磁盘访问,提高查询效率。

3. 使用自动内存管理 AMM(Automatic Memory Management):- AMM是Oracle 11g及以上版本中提供的内存管理特性,可以自动分配SGA和PGA的大小。

可以通过设置MEMORY_TARGET参数来启用AMM。

4. 使用自动PGA管理:- Oracle 12c及以上版本中提供了自动PGA管理特性,可以根据需要自动调整PGA的大小。

可以通过设置PGA_AGGREGATE_TARGET参数来启用自动PGA管理。

5. 合理配置数据库连接池:第1页/共2页锲而不舍,金石可镂。

- 如果数据库中有大量的并发连接,可以考虑启用连接池来管理连接,减少连接的开销,提高数据库的并发性能。

6. 合理配置数据库缓存:- Oracle数据库中有多个缓存区域,如数据缓存、共享池等,可以根据具体的负载情况,调整缓存的大小,以提高查询性能。

需要注意的是,内存优化操作可能会引起数据库的性能变化,因此在进行内存优化之前,最好先进行充分的测试和评估,以确保优化操作是必要且有效的。

Oracle 性能调整内存篇PPT课件

Oracle 性能调整内存篇PPT课件
estd_physical_read_factor, estd_physical_reads FROM V$DB_CACHE_ADVICE WHERE name = 'DEFAULT' AND block_size =
(SELECT value FROM V$PARAMETER WHERE name = 'db_block_size') AND advice_status = 'ON';
➢ 系统全局区
数据缓冲区 共享池 日志缓冲区
➢ 程序全局区
PGA UGA
内存优化
内存最基本的优化方法
➢ 增加内存的大小
增加内存是最简单的优化方法 增加内存不是万金油 增加内存到足够大,内存对性能的增益不是线性递增的
➢ 内存增加到多大合适?
增加到性能增益曲线的拐点或者平滑点 平衡性能和资源的需求 两种方法判断内存大小:
12582912 .5 631649280 3530752 99
3
18874368 .75 631649280
0
100
2
25165824
1 631649280
Oracle 性能调整
Oracle内存优化
Server process
PGA
Shared Pool
Library Cache
Data Dictionary Cache
SGA
Database Buffer Cache
Redo Log Buffer
Stream pool
Large Pool
Java Pool
1Hale Waihona Puke 397263961.2
20
4389 5961

Oracle性能调优——基本参数调整

Oracle性能调优——基本参数调整

Oracle性能调整(一)——基本参数调整一、操作系统参数交换区是Oracle的一项基本的要求。

可以根据Oracle的发行要求来确定。

一般交换区大小的要求是该服务器内存的2倍至4倍之间,建议是内存的4倍Note2:oracle 文件设置当服务器平台已完成操作系统的安装后,就应该开始认真的考虑下面的问题:A、是否采用裸设备实际应用的生产系统基本都是采用裸设备,使用裸设备对于读写频繁的数据库应用来说,可以极大地提高数据库系统的性能。

B、安装点的考虑Oracle的安装点就是指数据文件、日志文件和控制文件的安置路径,为了使系统在以后运行性能达到优化,建议将数据文件、日志文件和控制文件的安置路径与数据库系统存放在不同的路径上。

最好将数据文件、日志文件和控制文件分别存放在不同的路径。

C、SYSTEM表空间对应数据文件在自定义安装会话中,建议你根据需要设置system表空间所对应的数据文件的大小。

一般要设置比默认值的2倍。

该数据文件的大小最好是在300MB至500MB间。

因为数据文件太小不利于系统的运行。

D、临时表空间对应的数据文件临时表空间对应的数据文件可以根据将来系统存放的应用的处理情况来定。

比如系统将来可能要经常进程排序处理,则需要设置较大的临时表空间,也可能需要再建立新的临时表空间。

这里建议临时表空间的数据文件在100MB至300MB左右。

E、回滚段表空间对应的数据文件回滚表空间都是系统管理,初始值也是根据系统事务量预估计的值,实际到运行阶段如果系统常出现ORA-01555错误的时候,可能就需要增加回滚表空间的大小。

F、日志文件的大小日志文件的大小对于Oracle系统的运行也是相当重要。

默认值是太小。

实际根据事务繁忙预估计日志大小,没有固定的具体值范围,建议重做日志切换时间不能过短也不能过长,一般在20-40分钟左右。

该参数可以在系统运行期间根据数据库系统日志切换时间重新调整,控制文件的大小。

G、数据库块的大小如果你的应用系统是OLTP的话,可以采用较小的数据库块。

如何给Oracle数据库分配内存

如何给Oracle数据库分配内存

曾几何时,网络上流传着给Oracle数据库分配内存的一条法则:把80%的内存分配给Oracle使用,而又将这80%的内存分配80%给Oracle的SGA,剩下的20%分给Oracle的PGA。

记得Tom曾说过类似这样的话:如果一个参数的设置对Oracle是最佳的,那么Oracle就会自动地将其设为了默认值。

而显然,在内存分配这事上,Oracle的初始设置并不是按这个法则的,那么就是说从某一方面证明这个法则存在问题。

当然大部分DBA不会这样设置内存参数,但是也有不少的人在Oracle的内存分配上存在欠考虑的地方。

首先,我们来看看保留可用内存20%给操作系统是否合适。

对于2G内存的服务器(现实中这样的机器不少),20%意味着400M,而通常400M对操作系统来说是不够用的。

而对于内存特别多的主机,20%又显得太多。

比如下面是一份来自于一台P595的内存情况:view plaincopy to clipboardprint?1.====================================================|==========|===========2.Memory Overview| Pages | Megabytes3.----------------------------------------------------|----------|-----------4.Total memory in system| 45875200 | 179200.005.Total memory in use| 34789026 | 135894.636.Free memory| 11086174 | 43305.367.====================================================|==========|===========8.Segment Overview| Pages | Megabytes9.----------------------------------------------------|---------|-----------10.Total segment id mempgs| 32618956 | 127417.7911. Total fork tree segment pages| 2074 | 8.1012. Total kernel segment id mempgs| 3594452 | 14040.82这台主机共计179GB物理内存,已使用135G,其中内核占用14G。

Oracle内存参数调优设置

Oracle内存参数调优设置

Oracle内存参数调优设置Oracle 数据库系统中起到调节作⽤的参数叫初始化参数,数据库管理员根据实际情况需要适当调整这些初始化参数以优化Oracle系统。

1 主要系统参数调优介绍 2 系统内存参数的分配 2.1 Oracle 实例= 内存结构 + 进程结构 内存结构 = SGA + PGA SGA(系统全局区):⽤户存储数据库信息的内存区,该区域为数据库进程所共享。

它包含服务器的数据和控制信息,主要包含⾼速数据缓冲区、共享池、重做⽇志缓存区、Java池,⼤型池等内存结构。

SGA的设置,理论上SGA的⼤⼩应该占OS的内存的 1/3-1/2左右。

SGA + PGA + OS使⽤的内存 < 总的物理内存 查看当前系统SGA的信息select name,bytes/1024/1024 as "Size(M)"from v$sgainfo; 根据查询信息显⽰当前还有148M可⽤的SGA内存,系统当前的内存配置并不是最优的,我们在实际使⽤过程中根据情况可以重新分配内存。

2.2 SGA的设置原则 SGA = (db_block_buffers * db_block_size) + (shared_pool_size + large_pool_size + java_pool_size + log_buffers) (1)缓冲区⾼速缓存(database_buffer_cache):主要存储由磁盘数据⽂件写⼊的数据 ⼤⼩:db_block_buffers * db_block_size分配原则:缓冲区⾼速缓存的调整,⽤户进程所存取的所有数据都是经过缓冲区⾼速缓存来存取,所以该部分的命中率,对性能⾄关重要。

缓冲区⾼速缓存的使⽤情况记录在动态性能表v$sysstat中,可通过查询该表来了解其活动情况,以决定如何调整。

select name,value from v$sysstat where name in ('dbblock gets','consistent gets','physical reads');dbblock gets和consistent gets的值是请求数据缓冲区中读的总次数。

oracle调整方案

oracle调整方案

oracle调整方案Oracle 调整方案概述:在使用 Oracle 数据库的过程中,为了提高性能和优化查询效率,调整数据库配置和参数设置是一个重要的工作。

本文将介绍一些常见的Oracle 数据库调整方案,帮助您优化数据库性能。

一、硬件配置调整1. 增加内存:增加数据库服务器的内存可以提高数据库的性能,特别是在处理大量并发查询和高负载的情况下。

2. 增加硬盘容量:如果数据库的数据量持续增长,可以考虑增加硬盘容量,以确保数据库有足够的空间存储数据。

3. 使用高速磁盘:使用高速磁盘,如固态硬盘(SSD),可以提高数据库的读写速度和响应时间。

二、数据库参数调整1. SGA(System Global Area)调整:SGA 是 Oracle 数据库的内存区域,包括共享池、数据库缓冲区等。

可以通过调整 SGA 参数的大小来提高数据库的性能。

2. PGA(Program Global Area)调整:PGA 是每个连接到数据库的进程所使用的内存区域,可以通过调整 PGA 参数的大小来优化 SQL 查询性能。

3. 调整日志缓冲区大小:适当增加日志缓冲区的大小可以提高数据库的写入性能,特别是在大批量写入数据的情况下。

4. 调整查询优化器参数:Oracle 使用查询优化器来生成最优的执行计划。

通过调整一些查询优化器参数,如 optimizer_mode、optimizer_index_cost_adj 等,可以提高查询效率。

三、索引调整1. 分析索引的使用情况:使用 Oracle 提供的分析工具,如 Explain Plan,可以分析查询语句的执行计划和索引的使用情况。

根据分析结果,可以考虑删除不使用或者很少使用的索引,减少索引维护的开销。

2. 创建合适的索引:对于经常用于查询的列,可以创建合适的索引,提高查询性能。

但是要注意索引的数量和大小,过多或过大的索引会增加数据库的开销。

3. 索引压缩:对于大型表的索引,可以考虑使用 Oracle 提供的索引压缩功能,减少索引的大小,提高查询性能。

oracle11g关于内存的分配方案。

oracle11g关于内存的分配方案。

oracle11g关于内存的分配方案。

1,在32位的操作系统上,安装oracle的话,oracle最大能分配到的内存是1.7G。

这样的话,推荐最好使用64位的操作系统。

这样在物理内存足够大的情况下,oracle也能分配到无限制的足够大的内存。

2,在物理内存既定的情况下,如果服务器是只为oracle应用提供的服务器。

在创建数据库实例时,oracle的典型内存分布,默认总共给sga 和pga分配系统内存的40%,同时oracle建议自动内存管理。

此时,如果选择oracle的典型内存分布,同时不选择自动管理内存分布,那么sga : pga的内存比是3:1。

但是当sga的内存达到1536M之后,就不会再增加内存了,多出来的内存全都被增加到了pga的内存中去了。

(问题一:请问一下,如果是自动管理内存分布的话,sga和pga 也会出现这样的情况吗? sga达到1536m之后也不会继续增加吗?问题二:pga增多的话,排序等的性能会增加。

但是如果适当的增加sga,将表数据全都缓存到sga中的话,内存中的排序等性能同样会得到很大的提升。

为什么典型配置在sga增加到1536m之后就不再增加了呢?)3,定制数据库实例的内存时:pga,根据实际的情况,可以增加到足够大。

sga的共享池,日志缓冲池如果过大的话,会对性能产生较大的负面影响。

sga的java池,建议20msga的共享池,建议sga的22%sga的large池,建议sga的9.9%sga的缓冲区,可以设置到足够大。

(问题三,当创建数据库实例时,如果选择的是自动管理内存的话,这时的内存结构参数的值都是0。

如果只想要手动管理sga的一个缓冲区的话,是不是必然将重新手动设置sga的全部内存结构?包括重新设置sga本身的大小?)4,问题四:请问一下,如果手动设置的话,那sga和pga的内存比应该多少比较合适?以上只是个人的一些理解,有可能有错误的地方,希望大家能帮忙指出,最后将做出总结,将错误的地方改正。

Oracle数据库教程 —— solaris内存参数调整及管理

Oracle数据库教程 —— solaris内存参数调整及管理

Oracle数据库教程—— solaris内存参数调整及管理一、solaris 内存参数说明shared memory:共享内存段:一个内存区域,可以被不同的进程读取。

Oracle使用它来构成SGA。

Oracle使用以下三种方法来创建一个SGA区:1.使用单个共享内存段。

2.使用连续多个共享内存段。

3.使用多个不连续共享内存段。

Oracle优先使用第一种方法,如果成功,则继续初始化,不成功则使用第二种方法,再不成功则使用第三种方法。

如果再不成功,则初始化失败,Oracle报告错误代码。

Semaphore:可以看作一个标记。

可以有On和Off两种状态。

Oracle使用semaphores来实现服务器进程对SGA区的存取控制。

Shared memory 和semaphore 是Oracle在Unix上运行的重要资源。

如果Oracle 实例得不到所需要的资源,实例启动就会失败。

参数:对于运行一个Oracle实例的Solaris系统,改变/etc/system文件中的一些关于共享内存的参数,以使Oracle实例可以正常运行。

如果有多个实例的话,还需根据下面方法重新计算某些值。

shmmax含义:这个设置并不决定究竟Oracle数据库或者操作系统使用多少物理内存,只决定了最多可以使用的内存数目。

这个设置也不影响操作系统的内核资源。

设置方法:0.5*物理内存。

如果物理内存为20G,则 0.5×20G×1024×1024=10485760例子: Set shmsys:shminfo_shmmax=10485760shmmin含义:共享内存的最小大小。

设置方法:一般都设置成为1。

例子: Set shmsys:shminfo_shmmin=1shmmni含义:系统中共享内存段的最大个数。

推荐值为100或者128。

例子:Set shmsys:shminfo_shmmni=100shmseg含义:每个用户进程可以使用的最多的共享内存段的数目。

全面分析Oracle数据库的内存配置

全面分析Oracle数据库的内存配置

Oracle内存全面分析(1)作者:fuyuncat来源:Oracle的内存配置与oracle性能息息相关。

而且关于内存的错误(如4030、4031错误)都是十分令人头疼的问题。

可以说,关于内存的配置,是最影响Oracle性能的配置。

内存还直接影响到其他两个重要资源的消耗:CPU 和IO。

首先,看看Oracle内存存储的主要内容是什么:•程序代码(PLSQL、Java);•关于已经连接的会话的信息,包括当前所有活动和非活动会话;•程序运行时必须的相关信息,例如查询计划;•Oracle进程之间共享的信息和相互交流的信息,例如锁;•那些被永久存储在外围存储介质上,被cache在内存中的数据(如redo log条目,数据块)。

此外,需要记住的一点是,Oracle的内存是与实例对应的。

也就是说,一个实例就有一个独立的内存结构。

先从Oracle内存的组成架构介绍。

1.Oracle的内存架构组成Oracle的内存,从总体上讲,可以分为两大块:共享部分(主要是SGA)和进程独享部分(主要是PGA 和UGA)。

而这两部分内存里面,根据功能不同,还分为不同内存池(Pool)和内存区(Area)。

下面就是Oracle内存构成框架图:SGAShare Pool Buffer Cache Redo Log BufferJava Pool Stream Pool(10g)Large PoolPGA*nBitmap merge area Sort Area Hash AreaUGA*nCUA*n下面分别介绍这两块内存区。

1.1.SGA(System Global Area)SGA(System Global Area 系统全局区域)是一组包含一个Oracle实例的数据和控制信息的共享内存结构。

这句话可以说是SGA的定义。

虽然简单,但其中阐述了SGA几个很重要的特性:1、SGA的构成——数据和控制信息,我们下面会详细介绍;2、SGA是共享的,即当有多个用户同时登录了这个实例,SGA中的信息可以被它们同时访问(当涉及到互斥的问题时,由latch和enquence控制);3、一个SGA只服务于一个实例,也就是说,当一台机器上有多个实例运行时,每个实例都有一个自己的SGA,尽管SGA来自于OS的共享内存区,但实例之间不能相互访问对方的SGA区。

某企业Oracle 10g的内存调整报告

某企业Oracle 10g的内存调整报告

Oracle 10g的内存调整报告SGA--(初始化参数sga_target)||__shared pool(初始化参数shared_pool_size) chunk链表结构构成Bucket | || |__library cache| || |__dictionary cache| || |__reserved size (初始化参数shared_pool_reserved_size)|||__ DEFAULT buffer cache(初始化参数db_cache_size) LRU链表结构||__KEEP buffer cache (初始化参数db_keep_cache_size)||__RECYCLE buffer cache (初始化参数db_recycle_cache_size)|||__ large pool (初始化参数large_pool_size)||__java pool (初始化参数java_pool_size)||__ streams pool (初始化参数streams_pool_size)||__log buffer (初始化参数log_buffer)PGA--(初始化参数pga_aggregate_target)||__ sort_area_size||__ bitmap_merge_area_size||__ hash_area_size||__ open_cursors||__ oracle 堆栈和TNS堆栈PRE_PAGE_SGAoracle实例启动时,会只载入各个内存区最小的大小。

而其他SGA内存只作为虚拟内存分配,只有当进程touch到相应的页时,才会置换到物理内存中。

但我们也许希望实例一启动后,所有SGA都分配到物理内存。

这时就可以通过设置PRE_PAGE_SGA参数来达到目的了。

这个参数的默认值为FALSE,即不将全部SGA置入物理内存中。

当设置为TRUE时,实例启动会将全部SGA置入物理内存中。

Oracle 内存分配与调整.

Oracle 内存分配与调整.

Oracle 内存分配与调整一、前言对于oracle 的内存的管理,截止到9iR2,都是相当重要的环节,管理不善,将可能给数据库带来严重的性能问题。

下面我们将一步一步就内存管理的各个方面进行探讨。

二、概述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 中。

对于SGA 部分,我们通过sqlplus 中查询可以看到:SQL> select * from v$sga;NAME V ALUEFixed Size 454032Variable Size 109051904Database Buffers 385875968Redo Buffers 667648其中: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 三部分内存。

oracle内存分配与调整

oracle内存分配与调整

Oracle内存分配与调整者l 作者介绍冯春培,毕业于北京信息工程学院。

曾做电信计费后台程序开发,从事过开发DBA工作,目前公司主要做数据库优化产品开发。

热爱ORACLE,在任数据库管理版块版主(biti_rainy),个人兴趣主要在oracle internal、performance tuning。

对数据库管理、备份与恢复、数据库应用开发、SQL优化均有广泛理解。

希望大家一起探讨oracle及相关技术。

l 前言对于oracle的内存的管理,截止到9iR2,都是相当重要的环节,管理不善,将可能给数据库带来严重的性能问题。

下面我们将一步一步就内存管理的各个方面进行探讨。

l 概述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中。

对于SGA部分,我们通过sqlplus中查询可以看到:SQL> select * from v$sga;NAME VALUE-------------------- ----------Fixed Size 454032Variable Size 109051904Database Buffers 385875968Redo Buffers 667648Fixed Sizeoracle 的不同平台和不同版本下可能不一样,但对于确定环境是一个固定的值,里面存储了SGA各部分组件的信息,可以看作引导建立SGA的区域。

调整概述调整Oracle的内存使用调整Oracle的磁盘利用概要

调整概述调整Oracle的内存使用调整Oracle的磁盘利用概要

SELECT statement 2
SELECT statement 1
SELECT statement 1
Library Cache的调整
• 减少不命中,达到最小的分析次数
– 保证用户可以共享语句 – 防止语句因过时而导致的清除 – 避免语句因失效而导致的重新分析
Library Cache的调整
如果reloads-to-pins率大于1%时,则需要适当 提高初始化参数SHARED_POOL_SIZE。
失效
INVALIDATIONS列表示此项目被做出失效标记的次 数,失效标记可以引起重新装入
SQL> select namespace,pins,reloads,invalidations 2 from v$librarycache; NAMESPACE PINS RELOADS INVALIDATIONS --------------- --------- --------- -------------
• 用来存储用户共享的SQL语句和PL/SQL 块 • 由LRU算法进行管理 • 用来防止语句的重新分析
The Library Cache
Shared SQL, PL/SQL areas
Context area for SELECT statement 2
Context area for SELECT statement 1
SQL AREA 1793 10 0 SQL> ANALYZE TABLE scott.s_dept COMPUTE STATISTICS; SQL> select * from scott.s_dept;
NAMESPACE PINS RELOADS INVALIDATIONS --------------- --------- --------- ------------SQL AREA 1797 11 4

ORACLE性能调整调整内存分配

ORACLE性能调整调整内存分配

规则:减少Library Cache重载
重载应该接近于0,同执行的比率小于1%
SQL> select sum(pins) "Executions", sum(reloads)
2
"Cache Misses", sum(reloads)/sum(pins)
3 from v$librarycache;
Executions Cache Misses sum(reloads)/sum(pins)
须解析到同一SCHEMA的同一对象 – 准则3:SQL语句中使用的变量的名字和数据类型必须匹配 – 准则4: SQL语句必须使用相同的优化方法和优化目标
– 策略1:语句中尽量使用变量而不要使用常量 – 策略2:确保应用用户不会改变优化方法和目标 – 策略3:标准化的变量命名和空格转换 – 策略4:尽可能使用存储过程
Library Cache的大小
– 存储对象的空间(表,索引,存储过程,视图等)
SQL> select sum(sharable_mem) 2 from V$DB_OBJECT_CACHE;
SUM(SHARABLE_MEM) -----------------
379600
– 常用SQL命令的空间
SQL> select sum(sharable_mem) 2 from V$SQLAREA where executions > 5;
做日志文件的I/O次数
诊断
• V$SESSION_WAIT--是否有等待(由于会话写数据的速
度快于LGWR) – SELECT sid,event,seconds_in_wait,state – FROM v$session_wait – WHERE event=‘log buffer space%’;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Oracle 内存分配与调整一、前言对于oracle 的内存的管理,截止到9iR2,都是相当重要的环节,管理不善,将可能给数据库带来严重的性能问题。

下面我们将一步一步就内存管理的各个方面进行探讨。

二、概述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 中。

对于SGA 部分,我们通过sqlplus 中查询可以看到:SQL> select * from v$sga;NAME V ALUEFixed Size 454032Variable Size 109051904Database Buffers 385875968Redo Buffers 667648其中: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(不同环境可能不一样。

参考如下内容SQL> select substr(name,1,10 name,substr(value,1,10 value2 from v$parameter where name = 'log_buffer';NAME V ALUElog_buffer 524288SQL> select * from v$sgastat ;POOL NAME BYTESfixed_sga 454032buffer_cache 385875968log_buffer 656384SQL> select * from v$sga;NAME V ALUEFixed Size 454032Variable Size 109051904Database Buffers 385875968Redo Buffers 667648关于各部分内存的作用,参考oracle 体系结构,在此不再叙述。

l 、SGA 的大小那么我们现在来考察内存参数的设置。

实际上,对于特定的环境,总是存在着不同的最优设置的,没有任何一种普遍适用的最优方案。

但为什么在这里我们还要来谈设置这个话题呢,那仅仅是出于一个目的,避免过度的犯错误。

事实上,在任何一个生产系统正式投入使用之前,我们不拥有任何系统运行信息让我们去调整,这样就只有两种可能,一是根据文档推荐设置,另外一种就是根据经验设置。

相对来说,根据经验的设置比根据文档的设置要可靠一些。

尤其是那些24*7 的系统,我们更要减少错误的发生。

那么我们尝试去了解不同的系统不同的应用的具体设置情况,从而提供一个参照信息给大家。

为了得出一个参照设置,我们就必须假定一个参照环境。

以下所有设置我们基于这样一个假定,那就是硬件服务器上只考虑存在操作系统和数据库,在这个单一的环境中,我们来考虑内存的设置。

在设置参数之前呢,我们首先要问自己几个问题1物理内存多大2操作系统估计需要使用多少内存3数据库是使用文件系统还是裸设备4有多少并发连接5应用是OLTP 类型还是OLAP 类型根据这几个问题的答案,我们可以粗略地为系统估计一下内存设置。

那我们现在来逐个问题地讨论,首先物理内存多大是最容易回答的一个问题,然后操作系统估计使用多少内存呢?从经验上看,不会太多,通常应该在200M 以内(不包含大量进程PCB。

接下来我们要探讨一个重要的问题,那就是关于文件系统和裸设备的问题,这往往容易被我们所忽略。

操作系统对于文件系统,使用了大量的buffer 来缓存操作系统块。

这样当数据库获取数据块的时候,虽然SGA 中没有命中,但却实际上可能是从操作系统的文件缓存中获取的。

而假如数据库和操作系统支持异步IO,则实际上当数据库写进程DBWR 写磁盘时,操作系统在文件缓存中标记该块为延迟写,等到真正地写入磁盘之后,操作系统才通知DBWR 写磁盘完成。

对于这部分文件缓存,所需要的内存可能比较大,作为保守的估计,我们应该考虑在0.2—0.3 倍内存大小。

但是如果我们使用的是裸设备,则不考虑这部分缓存的问题。

这样的情况下SGA 就有调大的机会。

关于数据库有多少并发连接,这实际上关系到PGA 的大小(MTS 下还有large_pool_size。

事实上这个问题应该说还跟OLTP 类型或者OLAP 类型相关。

对于OLTP 类型oracle 倾向于可使用MTS,对于OLAP 类型使用独立模式,同时OLAP 还可能涉及到大量的排序操作的查询,这些都影响到我们内存的使用。

那么所有的问题综合起来,实际上主要反映在UGA 的大小上。

UGA 主要包含以下部分内存设置SQL> show parameters area_sizeNAME TYPE V ALUEbitmap_merge_area_size integer 1048576create_bitmap_area_size integer 8388608hash_area_size integer 131072sort_area_size integer 65536SQL>在这部分内存中我们最关注的通常是sort_area_size,这是当查询需要排序的时候,数据库会话将使用这部分内存进行排序,当内存大小不足的时候,使用临时表空间进行磁盘排序。

由于磁盘排序效率和内存排序效率相差好几个数量级,所以这个参数的设置很重要。

这四个参数都是针对会话进行设置的,是单个会话使用的内存的大小,而不是整个数据库使用的。

偶尔会看见有人误解了这个参数以为是整个数据库使用的大小,这是极其严重的错误。

假如设置了MTS,则UGA 被分配在large_pool_size,也就是说放在了共享内存里面,不同进程(线程之间可以共享这部分内存。

在这个基础上,我们假设数据库存在并发执行server process 为100 个,根据上面我们4 个参数在oracle8.1.7 下的默认值,我们来计算独立模式下PGA 的大致大小。

由于会话并不会经常使用create_bitmap_area_size 、bitmap_merge_area_size,所以我们通常不对四个参数求和。

在考虑到除这四个参数外会话所保存的变量、堆栈等信息,我们估计为2M,则200 个进程最大可能使用200M 的PGA 。

现在,根据上面这些假定,我们来看SGA 实际能达到多少内存。

在1G 的内存的服务器上,我们能分配给SGA 的内存大约为400—500M 。

若是2G 的内存,大约可以分到1G 的内存给SGA,8G 的内存可以分到5G 的内存给SGA 。

当然我们这里是以默认的排序部分内存sort_area_size=64k 进行衡量的,假如我们需要调大该参数和hash_area_size 等参数,然后我们应该根据并发的进程的数量,来衡量考虑这个问题。

事实上,通常我们更习惯通过直观的公式化来表达这样的问题:OS 使用内存+SGA+并发执行进程数*(sort_area_size+hash_ara_size+2M <0.7* 总内存(公式是死的,系统是活的,实际应用的调整不必框公式,这不过是一个参考建议在我们的实际应用中,假如采用的是裸设备,我们可适当的增大SGA( 如果需要的话。

由于目前几乎所有的操作系统都使用虚拟缓存,所以实际上如果就算SGA 设置的比较大也不会导致错误,而是可能出现频繁的内存页的换入与换出(page in/out 。

在操作系统一级如果观察到这个现象,那么我们就需要调整内存的设置。

l SGA 内参数设置Log_buffer对于日志缓冲区的大小设置,通常我觉得没有过多的建议,因为参考LGWR 写的触发条件之后,我们会发现通常超过3M 意义不是很大。

作为一个正式系统,可能考虑先设置这部分为log_buffer=1—3M 大小,然后针对具体情况再调整。

Large_pool_size 对于大缓冲池的设置,假如不使用MTS,建议在20—30M 足够了。

这部分主要用来保存并行查询时候的一些信息,还有就是RMAN 在备份的时候可能会使用到。

如果设置了MTS,则由于UGA 部分要移入这里,则需要具体根据server process 数量和相关会话内存参数的设置来综合考虑这部分大小的设置。

Java_pool_size假如数据库没有使用JA V A,我们通常认为保留10—20M 大小足够。

事实上可以更少,甚至最少只需要32k,但具体跟安装数据库的时候的组件相关(比如http server 。

shared_pool_size这是迄今为止最具有争议的一部分内存设置。

按照很多文档的描述,这部分内容应该几乎和数据缓冲区差不多大小。

但实际上情况却不是这样的。

首先我们要考究一个问题,那就是这部分内存的作用,它是为了缓存已经被解析过的SQL,而使其能被重用,不再解析。

这样做的原因是因为,对于一个新的SQL (shared_pool 里面不存在已经解析的可用的相同的SQL,数据库将执行硬解析,这是一个很消耗资源的过程。

相关文档
最新文档