oracle 内存分配

转自:http://hi.baidu.com/andow2008/blog/item/d5ddf4b52651b27b8ad4b20a.html

配置 BUFFER CACHE

理解内存分配问题:

动态改变大小:
shared pool, large pool, java pool, and buffer cache 都是以granules为单位分配的。Granules取决与OS,比如32位NT,the granule size is 8 MB for SGAs larger than 128 MB,小于是4m,即即使指定1k,也会分配4m。
查看V$SGA_DYNAMIC_COMPONENTS获得各种buffer 的信息。

SGA_MAX_SIZE 参数:
默认是实际使用的SGA的和。可以设置成比SGA的和大一些,这样可以方便动态地增加cache size,而不用先要降低其他的cache

改变或增加应用,应该适当的调整oracle 内存结构以满足。

OS内存使用:
减少paging,paging是指将贮存在内存中的page转移到disk而使得新的page进入内存,会降低性能。可以增大内存,或者减少内存使用。
将SGA保持在内存中。LOCK_SGA参数将sga报留在物理内存中,防止被page out

~~~~~~~~~~~~~~~~~

配置和使用buffer cache

通过以下两种方式调整大小:
V$DB_CACHE_ADVICE / buffer cache hit ratio
1) V$DB_CACHE_ADVICE:
当DB_CACHE_ADVICE=on 时有效。列出各种估计的cache size 和对应的物理读。Size_FACTOR=1表示当前大小。
SELECT size_for_estimate, buffers_for_estimate, 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';

2) buffer cache hit ratio
低ratio并不能暗示增加cache size可以提高性能。高ratio有时反而会让你误认为cache size已经足够大而满足要求了。比如:重复的扫描一些大表或索引。因为大表的全表扫描往往都是物理读,会人为的降低hit ratio。检查并优化buffer get 较大的sql,Cache 一些经常访问的数据。
Db_cache_size 是针对默认的db_block_size的,对于非标准的block,要特别指定DB_nK_CACHE_SIZE 参数。

考虑Multiple Buffer Pools:
通常只使用default buffer pool就能满足应用。KEEP buffer pool 用来支持经常访问的segment。RECYCLE buffer pool用于不经常的大batch jobs,以防止其不必要的cache消耗。他们都使用LRU规则。通过V$BUFFER_POOL 得到各种pool 信息。
访问大segment的时候可以考虑:
1、 如果是索引,检查其是否selective,否则优化sql
2、 如果已经优化,则可以将其放入recycle cache中,这样就不会影响其他的segment。
3、 或者将一些小的热segment放入keep cache 中,这样可以减少cache buffer miss ratio

KEPP POOL:
如果应用中有的segment (比如小表)经常被访问,所以希望其长期保留在buffer中不被因某种因素ageout,可以将其存储在keep pool中。给KP分配内存,需要设置DB_KEEP_CACHE_SIZE参数,是独立于default buffer的。
大小取决于你想keep的segment,可以通过V$BH查看segment所占用的buffer,或者通过DBA_TABLES.BLOCKS and DBA_TABLES.EMPTY_BLOCKS得到used blocks
The NOCACHE(默认值) clause has no effect on a table in the KEEP cache.( alter table t nocache;)
可以改变segment的storage( buffer_pool keep),然后在dba_table.buffer_pool体现:
SQL> alter table t
2 storage(buffer_pool keep);

RECYCLE Pool:
用于不经常访问的大segment,不希望其保留在内存中,而影响buffer被其他对象使用。
需要设置DB_RECYCLE_CACHE_SIZE,同样独立于db_cache_size


配置和使用Shared Pool and Large Pool

包括PL/SQL blocks and SQL,dictionary cache data和其他。正确配置的好处在于:
1、 避免SQL重复parse,减少CPU资源使用
2、 减少latch资源争用
3、 减少IO,因为dictionary elements避免了访问磁盘

Shared Pool Concepts
包括library cache 和dictionary cache,根据需要自动增加或减少。
  library cache包括parsed or compiled的PL/SQL blocks 和 SQL以及JAVA类。v$librarycache
  dictionary cache 存放了来自 data dictionary的数据。比如usernames, segment information, profile data, tablespace information, and sequence numbers等,在解析和编译SQL时引用.
  Shared Pool 的cache miss开销比buffer cache的大很多,所以要谨慎设置。
  共享池内存分配以chunks(大块)为单位,这样允许大对象(5K)直接CACHE到内存中,而不需要申请一段连续的空间,这样可以减少碎片带来的空间浪费.
  reserved pool:Shared Pool隔离出来的一小段,用来存放大于5k的大对象.

Hard / soft parse:
  Soft parse使用的资源包括CPU 和library cache latch gets
  Hard parse是指要解析的SQL没有在library cache中,或者执行的时候发现解析过的SQL已经aged out,就是离开了library cache,称为Library cache misses.使用的资源包括额外的CPU, library cache latch gets, 以及shared pool latch gets.

Using the Shared Pool Effectively
  Shared Cursors
  SQL中尽量指定表的owner,而不使用public synonyms.,可以significantly reduces the number of entries in the dictionary cache.令一种方法是使用同样的USERID访问数据库.尽量使用存储过程.
  避免在高峰时期执行DDL,因为这样会使相关连的SQL失效,要重新编译.
  Cache Sequence Numbers可以减少dictionary cache locks,比如:ALTER SEQUENCE customers_seq CACHE 5; 事先cache 5个.2~28

Sizing the Shared Pool
不能太大,因为需要维护共享的结构,同时使得SQL的老化的代价更高,带来大量的管理开销,导致CPU的严重问题.在充分利用绑定变量的系统,通常100m(1G)~300m(8G), erp 可以达到500m.

Library Cache 的配置:
可以通过以下3点判断:
1)V$LIBRARYCACHE:
RELOAD列反映了之前已经CACHE的对象,后来AGED OUT了,然后又被re-load (re-parsing)的SQL数量.因为其object handle已经建立,所以会有这个统计结果.期望值应该为0.
INVALIDATIONS 列反映了对象失效的次数,导致的原因比如DDL操作等.系统高峰时期的期望值应该为0.如果过大,应该减少高峰时期DDL操作,或者适当减小共享池配置.
PINS:The number of times a PIN was requested for objects of this namespace
PINHITS:The number of times all of the metadata pieces of the library object were found in memory
SELECT namespace, pins, pinhits, reloads, invalidations
FROM V$LIBRARYCACHE
ORDER BY namespace;

NAMESPACE             PINS    PINHITS    RELOADS INVALIDATIONS
--------------- ---------- ---------- ---------- -------------
SQL AREA          21536413   21520516      11204             2
...
SQL AREA部分,执行了21536413次,11204次导致library cache miss,需要reparse SQL或者reload定义;2次INVALIDATIONS,同样导致library cache miss
Library Cache Hit Ratio = sum(pinhits) / sum(pins)
2)V$SGASTAT:
高峰时期检查pool=’shared pool’ and name=’free memory’值,应该尽量低.
3)Library cache hit ratio:
考察hard parsing rate的大小,是否有shared pool latch 和 library cache latch的竞争.

Shared Pool Advisory Statistics
V$SHARED_POOL_ADVICE.ESTD_LC_TIME_SAVED:表示Parse time saved
V$LIBRARY_CACHE_MEMORY: library cache中各个命名空间的具体内存

Dictionary Cache的配置:
通常shared pool满足了library cache后,dictionary cache也会被满足.
Instance刚启动的时候,dictionary cache没有任何的数据.任何的SQL都会导致cache miss.逐渐的,数据越多,miss越小.
V$ROWCACHE记录了library cache中每种数据字典item类型的统计信息:
Parameter:数据字典item类型
Gets: 对这种类型数据的请求次数.
Getsmiss:请求失败,需要IO读取磁盘
Modifications: 数据被修改(update, insert , delete)的次数

Interpreting Shared Pool Statistics
增大shared_pool_size的同时,考虑增加open_cursors参数(cursors permitted for a session).
如果reloads接近0,并且有大量的free memory,可以适当减小shared_pool_size


使用Large Pool
Large pool没有LRU链,oracle不会将对象aged out.Large pool用于以下情况:
Parallel query并行查询,Recovery Manager,shared server

Tuning the Large Pool and Shared Pool for the Shared Server Architecture
    使用large pool to allocate the shared server-related User Global Area (UGA),配置LARGE_POOL_SIZE,最小300k,查询v$sgastat
    Even though use of shared memory increases with shared servers, the total amount of memory use decreases. This is because there are fewer processes; therefore, Oracle uses less PGA memory with shared servers when compared to dedicated server environments.
For best performance with sorts using shared servers, set SORT_AREA_SIZE and SORT_AREA_RETAINED_SIZE to the same value. This keeps the sort result in the large pool instead of having it written to disk.
    V$SESSTAT:
    Session UGA memory: The value of this statistic is the amount of memory in bytes allocated to the session. (If the sessions are connected to dedicated server processes, then this memory is part of the memories of the user processes. If the sessions are connected to shared server processes, then this memory is part of the shared pool.可以根据这个值来配置large pool)
    Session UGA memory max: The value of this statistic is the maximum amount of memory in bytes ever allocated to the session.

PRIVATE_SGA:
来限制没个session从SGA中得到多少内存,很少用到.

使用CURSOR_SPACE_FOR_TIME(……)
配置Reserved Pool(……)
Keeping Large Objects to Prevent Aging(……)
CURSOR_SHARING for Existing Applications(……)

你可能感兴趣的:(oracle,sql,SQL Server,cache,配置管理)