tuning 第七章(一)

第七章 内存的配置和使用

本章讨论如何将内存分配到数据库的内存缓存中以及如何使用这些缓存。oracle建议使用自动内存管理,但也可以手工分配。

一、理解内存分配问题
数据库将数据存储在磁盘和内存的cache中,内存相对磁盘要快得多。访问磁盘需要大量时间,物理I/O还会增加CPU资源的需求,因为磁盘上的路径长度和操作系统的日程安排。
调优的目标是减少物理I/O,有两种方式,即尽可能从内存获取数据,或者使返回数据更加高效。

1.oracle中影响性能的内存cache包括shared pool、large pool、java pool、buffer cache、streams pool size、log buffer、Process-private memory(排序和hash join使用的内存)

2.自动内存管理
oracle推荐自动内存管理。需要设置初始化参数memory_target(内存大小目标值)、memory_max_target(内存大小的最大值)。
数据库根据目标内存大小调整SGA和PGA的内存分配。
在设置任何内存池的大小之前,需要考虑使用自动内存管理特性。如果不得不手工分配内存,考虑使用memory advisor管理内存

3.自动共享内存管理
自动共享内存管理减缓了SGA的分配。
需要将sga_target设置为非零值,statistics_level设置为typical或all
sga_target设置为打算为SGA分配的内存大小。

自动SGA管理为如下内存池分配内存:
buffer cache\shared pool\large pool\java pool\streams pool

如果内存池的自动调整设置为非零值,这些值将被作为自动内存管理使用的最小值。如果应用需要,可以为单个的内存池设置最小值。

sga_target可以通过OEM中内存参数SGA页对SGA size advisor的修改 实现修改,也可以通过查看v$sga_target_advice视图,并使用alter system命令修改。

如果在实例启动时将SGA_TARGET设置为0,动态禁用了sga_target,自动内存管理将被放弃,各个内存池使用当前自动分配的内存值。

可以手工设置db_cache_size、shared_pool_size、large_pool_size\java_pool_size等的大小。

大池、keep、recycle等非default的buffer caches池、fixed SGA和其他内部调整的值都是手工管理的。
通过设置db_keep_cache_size、db_recycle_cache_size、db_nK_cache_size和log_buffer等参数来设置这些池。

自动内存管理在计算自动调整的内存池大小时,这些参数也是由sga_target决定的。

4.动态修改cache sizes
如果未采用自动内存管理和自动共享内存管理,可以选择动态分配共享池、大池、buffer cache等的内存。
DB_CACHE_SIZE, JAVA_POOL_SIZE, LARGE_POOL_SIZE, LOG_BUFFER, and SHARED_POOL_SIZE都是动态分配的,可以通过alter system修改
log buffer pool、process-private内存是静态的。

共享池、大池、java池、内存缓冲区的大小都是以granule为单位分配的。若SGA《1G,该值是4MB,若SGA》1G,该值是16MB。当前大小可以在v$sga_dynamic_components中查到。

5.动态修改大小的信息查看
v$memory_current_resize_ops:当前正在进行内存大小修改的信息
v$memory_dynamic_components:所有动态分配的内存组建的当前大小,包括SGA和PGA的大小信息。
v$memory_resize_ops:最近800个已经完成的内存分配信息
v$memory_target_advice:为memory_target建议的值(可能空)
v$sga_current_resize_ops:SGA正在调整中的动态组件信息
v$sga_resize_ops:最近800条已完成的SGA内存分配信息
v$sga_dynamic_components:SGA中的动态组件。根据启动后发生的所有SGA大小分配得到的
v$sga_dynamic_free_memory:SGA进行动态分配可用的内存大小

6.应用上的考虑
配置内存时,缓存的大小需要根据应用的需要确定;相反,调整应用中缓存的使用会减少资源的需求。合理使用oracle内存的缓存可以减少锁、CPU、I/o等资源的使用。
为了提高性能,缓存应该更有效地使用操作系统和数据库的资源,内存结构中的组件内存分配应该很好地反映应用的需要。

7.操作系统中内存的使用
主要需要考虑如何减少Paging分页、fit the SGA into Main Memory、为单个用户调整内存
(1)reduce paging
paging发生在内存中驻留的页由于新页的加载而需要被转移到磁盘时。这会影响性能。
使用operating system utilities来监测操作系统中是否有大量的paging。如果有,说明系统内存可能无法承担所有的事务。
需要增加系统内存或减少系统负荷。

(2)将SGA放入主内存
SGA是为了在内存中快速存储数据,是main memory的一部分。如果将SGA上的分页操作放到磁盘上进行,数据就不能快速的访问了。
在许多系统中,paging的缺点远比大SGA的优点多。

使用lock_Sga参数可以将SGa锁定在物理内存中,组织其被paged out。这时数据库不使用memory_max_target和memory_target


二、buffer cache的配置和使用

1.有效使用buffer cache
为了有效使用buffer cache,需要调整sql语句来避免比必要的资源消耗。
为了达到此目的,需要确保经常执行的、进行了大量buffer gets操作的语句已经被调优过了。

2.大小的设置
新建实例后需要先评估一个buffer cache的值,然后在实例上进行一次有代表性的负载运行,查看是否达到要求。

判断方法有:
(1)查看v$db_cache_advice
当db_cache_Advice设置为on时生效。此视图显示出一系列潜在buffer cache大小的命中率
db_cache_Advice参数时动态设置的,可以根据特定的负载情况选择是否开启。
此特性开启时,会对CPU有一定影响。
应该保证查看v$db_cache_advice前,负载的稳定性。

根据视图中的信息可以做出是否需要调整cache大小的决定

(2)计算buffer cache的命中率
命中率是根据v$sysstat中的数据获得的,可以用此命中率来验证v$db_cache_Advice给出的物理I/O

3.解释和使用buffer cache advisory statistics
在调整buffer cache大小前有许多特征可以考虑,比如v$db_Cache_advice和buffer cache命中率。
但命令率低不一定需要增加buffer cache。
比如对某些非常大的表只执行一次,buffer cache中存储的数据可能不会被重复使用。

4.为buffer cache增加内存
首先将db_cache_advice设置为on,是存储数据稳定下来。
查看v$db_cache_Adice中的建议信息来决定每次增加的大小。在不影响系统page的情况下再去增加db_cache_Size的值。

如果需要,可以在不关闭实例的情况下动态调整buffer pool的值。

如果需要非标准块大小的表空间上设置cache size,需要设置db_nk_cache_size

减小的方法类似。

5.multiple buffer pools
通常来说一个buffer pools就足够了,但也可以使用多个。
对于非典型的段,可以将其存放在两个不同的buffer pools中:keep和recycle
使用keep池将段信息尽可能长时间地存放在缓存中,而recycle池避免浪费缓存。
对于未指定的数据,缓存在default池中。default池的大小由db_cache_size决定。
通过缓存可以减少或消除I/O,将对象隔离或限制在不同缓存中。

大对象的执行会造成LRU算法将很多数据清理出cache,当然,那些访问频率非常高的数据不会被清除(由于LRU算法),但执行频率较少的会受很大影响。解决方法为:
1)如果对象使用了索引,查看该索引的可选择性是否足够高,如果不是,换用其他索引
2)如果sql语句已经又花了,可以将这个大数据段放入recycle缓存中,以便其不影响其他段。recycle cache应该比default buffer pool小,并尽可能重用
3)同时,可以将经常使用的段放入keep池

对于群集环境下的实例,可以为每个实例创建多个buffer pool。每个实例不必相同。

在create、alter table、cluster、index的storage子句中使用buffer_pool关键字可以将数据存到default池中。
对于分区表和分区索引,每个分区继承表或索引的特性,除非强制其存储到特定buffer pool中。

6.buffer pool data in v$db_cache_advice
v$db_cache_Advice有实例中所有池大小的配置。

7.buffer pool hit ratios
v$sysstat反映了所有buffer pools中一系列物理读和逻辑读的统计。
查看v$buffer_pool_statistics得到单个缓存池的命中率。
命中率的计算公式为:
1 - (physical_reads/(db_block_gets + consistent_gets))

可以直接用如下语句查看:
SELECT NAME, PHYSICAL_READS, DB_BLOCK_GETS, CONSISTENT_GETS,
1 - (PHYSICAL_READS / (DB_BLOCK_GETS + CONSISTENT_GETS)) "Hit Ratio"
FROM V$BUFFER_POOL_STATISTICS;

8.判断哪个段在池中有大量buffers
v$bh中有当前SGA中所有数据块的对象ID。由此得到两种查看方式:
方法1:
COLUMN OBJECT_NAME FORMAT A40
COLUMN NUMBER_OF_BLOCKS FORMAT 999,999,999,999
SELECT o.OBJECT_NAME, COUNT(*) NUMBER_OF_BLOCKS
FROM DBA_OBJECTS o, V$BH bh
WHERE o.DATA_OBJECT_ID = bh.OBJD
AND o.OWNER != 'SYS'
GROUP BY o.OBJECT_NAME
ORDER BY COUNT(*);

方法2:
Use the following steps to determine the percentage of the cache used by an individual object at a given point in time:
1.Find the Oracle Database internal object number of the segment by entering the following query:
SELECT DATA_OBJECT_ID, OBJECT_TYPE
FROM DBA_OBJECTS
WHERE OBJECT_NAME = UPPER('segment_name');
Because two objects can have the same name (if they are different types of objects), use the OBJECT_TYPE column to identify the object of interest.
2.Find the number of buffers in the buffer cache for SEGMENT_NAME:
SELECT COUNT(*) BUFFERS
FROM V$BH
WHERE BJD = data_object_id_value;
where data_object_id_value is from step 1.
3.Find the number of buffers in the instance:
SELECT NAME, BLOCK_SIZE, SUM(BUFFERS)
FROM V$BUFFER_POOL
GROUP BY NAME, BLOCK_SIZE
HAVING SUM(BUFFERS) 0;
4.Calculate the ratio of buffers to total buffers to obtain the percentage of the cache currently used by SEGMENT_NAME:
% cache used by segment_name = [buffers(Step2)/total buffers(Step3)]

9.keep pool
可以将系统中经常使用的段存储到keep池。
需要设置db_keep_cache_size  不是default pool的一部分
池大小可以由待放入该池中数据库的数量决定。可以通过dba_tables.blocks和dba_tables.empty_blocks决定使用的块数量。
如果某个对象的大小在增加,可能不能插入keep池。
nocache选项对于keep池没有影响

10.recycle pool
设置db_recycle_cache_size
对于多步操作的数据,例如插入后又进行update操作,不要使用recycle pool

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26451536/viewspace-752162/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26451536/viewspace-752162/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值