性能调整

-------
oracle实例中的内存使用分为两类:程序全局区PGA和系统全局区SGA,前者专门供每个会话使用,后者由所有oracle进程使用。
oracle使用的所有内存都是虚拟内存。oracle进程无法确定所连接的内存是在RAM中,还是已经交换(或分页)到磁盘中。但是,交换会削弱性能,应予避免。
语句的共享sql区域在SGA的共享池中,而专用的sql区域在会话的PGA中。
-------------------------PGA内存管理
每个sql语句都使用sga中的内存(具体来说是共享池中的共享sql区域)并需要最低限度的pga内存(有时也称为专用sql区域),否则sql语句将无法执行。
提供更多的pga内存通常可以减少执行时间,但减少量并非直线下降。

针对oracle实例用户会话由连接到服务器进程的用户组成。用户进程生成sql语句,并将他们发送到服务器进程供执行,这就是客户端-服务器分离。与服务器进程关联在一起的是非共享内存块,PGA。
在执行sql语句时,服务器进程使用pga来存储会话特有的数据,包括临时表;排序行;合并位图,变量,调用堆栈。
pga中的某些数据的使用内存时不可转让的。
例如如果会话的调用堆栈需要内存,那么相应的内存必须可供使用。而对于其他结构(如临时存储)使用pga的效果是不错的,但pga并不是必需的,
其原因在于:如有必要。则可以将数据写出到基于磁盘的存储结构中,但这会对性能产生负面影响。


一般而言,有三种内存分配方式,分别时优化,单道,和多道。
(1) 优化内存分配允许语句完全自啊内存中执行,不需要使用磁盘上的临时存储。
    优化内存分配足以容纳所有输入数据以及相应语句必须创建的任何辅助数据结构。
(2) 单道内存分配对于优化执行而言是不充分的,将降至对数据进行额外的传输。
(3) 多道内存分配更小,意味着需要对数据进行多次传输。
例如,考虑一个排序操作。
理想状况是要排序所有行都可以读入PGA,并在那里排序。这里需要的内存是优化内存分配。如果无法进行优化内存分配,则需要将行分解成为多个批处理。每个批处理将读入内存,进行排序,然后保存到磁盘中。结果
得到磁盘上的一组有序批处理,此后,需要将他们读回内存中,并合并成最终的所有行的有序列表。此时需要的pga内存时单道分配;排序操作必须分解为多个排序,之后进行合并。如果单道内存分配依然实现不了,
则合并阶段和排序阶段要求使用临时磁盘存储,这就是多道执行。
最理想的状况是:所有sql语句都以最优方式执行,但这个目标可能遥不可及。在数据仓库操作中,如果针对大量的表执行查询,则优化内存分配量可能达到数GB。在此类环境中,单道执行最合适。要尽可能避免多道
执行。例如为了排序10GB的数据,要最理想的方式运行,有时可能需要10GB以上的内存,而在单道运行中,仅需要40MB。只有分配量低于40MB时,才执行多道排序,此时,执行时间将大幅增加。
-----自动pga内存管理
为了实现自动pga内存管理,需要设置pga内存分配总量(所有会话需要量之和)的目标。此后,oracle实例将根据需要,从总量中为会话分配内存。
在某个会话执行完语句后,此会话使用的pga可以分配给另一个会话。这种系统基于这样的事实:在任何时刻,只有某些已经连接上的花花需要任何转让的PGA内存。即使会话处于闲置状态,也都需要一定量的PGA内存来保留当前会话的状态,但总体看来,这会留下足够的空间使正在实际运行语句的会话获得需要的内存。至少说,这是希望达到的效果。

使用两个实例参数来启用自动pga内存管理
(1)workarea_size_policy
(2)pga_aggreagte_targert

workarea_size_policy默认值是auto,这意味着,oracle可以根据需要,将PGA分配给会话,同时力求将PGA分离总量保持在pga_aggreagte_targert范围以内。此参数的默认值设置是大于10MB,或者SGA大小的20%,应对其执行向上调整,直至令人满意的语句比例可以以最优方式执行,但又不至于过高,以致内存分配量过多,并且操作系统必须将虚拟内存分页到磁盘.
对于很多系统而言,pga_aggreagte_targert的默认值过小,不能达到最佳性能。

-----------------------------SGA内存管理

SGA包含多个内存结构,这些结构的大小可以独立地调整,如下所示
共享池,数据库缓冲区缓存,大池,流池,java池,日志缓冲区
一般规则是,分配给大池,java池和流池的内存不可转让。只是需要或不需要这样的内存。如果这些结构不够大,那么将发生错误;如果这些结构过大,就不会提高性能。
分配给共享池,数据库缓冲区的内存是可转让的:如果达不到最优大小,那么不会发生错误,但性能会因此下降。
共享池是一个例外;如果在较长时间内达不到最优大小,那么将会发生错误。
不要为oracle分配不必要的内存。过大的共享池或日志缓冲区会对性能产生严重的负面影响。过大的缓冲区缓存区应该不会带来问题,但前提是其大小不至于迫使系统执行交换操作。
SGA内存管理可以自动进行(oracle公司建议您这么做),但日志缓冲区属于例外情况。
dba设置SGA的总大小,实例依据总量将内存分配给各个结构,确保不存在因SGA组件不够大带来错误,且分配大于最小限度的内存使sga组件可以最佳状态运行。
将根据需要调整组件的大小,这样,如果组件需要更多内存,就可以从具有多余空间的组件那里获取内存。
日志缓冲区是一个SGA组件,其大小在启动实例时固定下来,无法进行自动管理。
--手动管理SGA的参数如下:
shared_pool_size
db_cache_size
large_pool_size
streams_pool_size
java_pool_size
-----自动共享内存管理(ASSM)
要启用sga自动管理,则保留使用所有这些参数的默认值(或将其设置为0),并设置一个参数来启用自动共享内存管理(ASSM)
--SGA_TARGET
在使用ASSM时,实例将监视各个SGA组件的内存需要,并根据需要将内存分配给组件,如有必要,就会减少内存容量,以便将内存分配总量控制在目标范围内。
包括在目标范围的还有日志缓冲区,其大小使用静态的log_buffer参数进行设置,在启动实例时创建日志缓冲区,其大小以后不能在调整。
日志缓冲区是唯一不能动态调整的SGA结构。因此,也不能自动管理它。
如果设置了任何控制自动管理的SGA组件的参数,那么给定的值将作为最小大小(ASSM不会使组件的内存低于此值)

-------------------------------------------------------------AMM自动内存管理

使用自动内存管理(AMM)机制时,通过设置memory_target这个参数,就可以让oracle实例从总体上管理服务器内存的使用,这允许oracle根据需要在PGA和SGA之间转换内存,从而将自动PGA(pga_aggregate_target启用)和自动共享内存管理(使用SGA_TARGET启用)又向前推进了一步。
要启用自动内存管理,设置一个参数memory_target,而不必设置上面列出的其他参数,log_buffer参数属于例外情况。(此参数通常也可以保留为默认值)
memory_target参数是动态的,可以自动不关闭实例的情况下对其进行调整,但其调整不能超过另一个参数memory_max_target设置的限制。
后者时静态的,要将其调整更大,只能通过SCOPR_SPFIL子句进行调整然后重新启动实例。

自动内存管理并非只是一个简化数据库管理的工具,它也会带来巨大的性能优势。很多数据库在不同时间经历不同的活动模式,他们将从不同的内存配置中获益。
例如,用于处理订单的数据库常在月中处理大事务,而在月底报告运行期间处理大量的查询,事物处理通常对PGA内存要求不高,但要求使用大的数据库缓冲区缓存。
查询处理同从需要大的PGA分配,并不需要过大的缓冲区缓存。
在实例中,无法根据活动模式的更改,在SGA和PGA之间手动转换内存,而且很多系统也无法同时为二者分配足够的内存来满足他们的峰值需求。
自动内存管理能够根据需要在SGA和PGA之间转换内存,以便在内存总量约束的范围内优化性能。必须由dba和系统管理员共同确定总体约束。
如果dba设置得上限过大,以至于操作系统必须将SGA和PGA分页到交换设备,这就会失去意义,系统管理员将建议适当的最大值。
如果在启用AMM的情况下设置了参数pag_aggregate_target或sga_target,那么指定的值将是最小大小(AMM不会使PGA或SGA低于此值)


------------------------内存顾问


-----------------------sql调整顾问


-----------------------sql访问顾问


-----------------------通过dbms_Advisor使用sql access advisor

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值