`

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内存分配与调整--大牛冯春培的一篇文章

    ### Oracle内存分配与调整——详解冯春培的文章 #### 一、引言 在Oracle数据库管理系统中,内存管理是一项至关重要的任务。不合理的内存配置可能导致性能下降甚至系统故障。冯春培作为一位经验丰富的Oracle专家,...

    Oracle 内存分配与调整

    本文将深入探讨"Oracle内存分配与调整"这一关键主题,旨在帮助你提升Oracle系统的运行效率和响应速度。 Oracle内存结构主要分为两大部分:SGA(System Global Area)和PGA(Program Global Area)。SGA是数据库进程...

    oracle内存分配与调整.pdf

    oracle内存分配与调整.pdforacle内存分配与调整.pdf

    oracle 内存分配与调整 。pdf

    本文将深入探讨Oracle内存分配的相关知识点,以及如何进行调整以优化数据库性能。 Oracle内存主要分为两个主要部分:SGA(System Global Area)和PGA(Program Global Area)。SGA是数据库进程共享的一块内存区域,...

    oracle内存资源分配

    "Oracle内存资源分配"是数据库管理员必须掌握的关键技能,它涉及到Oracle数据库系统的Shared Global Area (SGA) 和Program Global Area (PGA) 的配置与调整。 首先,SGA是Oracle数据库运行时共享内存的主要区域,它...

    Oracle内存分配与调整 pdf

    ### Oracle内存分配与调整:深度解析 #### 一、引言 在Oracle数据库的运维与优化过程中,内存管理扮演着至关重要的角色。特别是在Oracle 9iR2及之前的版本中,有效的内存管理策略能显著提升数据库性能,反之则可能...

    wxh oracle内存分配

    "wxh oracle内存分配"这个主题主要关注Oracle数据库在运行时如何管理和使用内存资源,以提高查询速度和整体系统效率。Oracle内存结构主要分为两个主要部分:SGA(System Global Area)和PGA(Program Global Area)...

    Oracle内存分配与调整

    有关Oracle数据库内存的分配与管理的原理及相关命令

    ORACLE性能调整-调整内存分配.rar

    首先,我们来了解Oracle内存的基本架构,它主要由两大部分组成:PGA(Program Global Area)和SGA(System Global Area)。PGA是为每个服务器进程单独分配的内存区域,用于存储过程变量、游标、排序区等。而SGA则是...

    oracle内存分配与调整

    对于oracle的内存的管理,截止到9iR2,都是相当重要的环节,管理不善,将可能给数据库带来严重的性能问题。 txt格式,方便在便携设备上浏览。

    Oracle内存分配与调整.rar

    本教程“Oracle内存分配与调整”聚焦于这个主题,旨在帮助IT从业者和数据库管理员深入理解Oracle内存结构,并掌握实际操作中的内存优化技巧。 首先,Oracle内存主要分为两个大的区域:PGA(Program Global Area)和...

    oracle内存分配整理

    oracle内存分配整理是PDF中文文档.

    oracle 内存分配和调优 总结

    oracle 的内存可以按照共享和私有的角度分为系统全局区和进程全局区,也就是 SGA和 PGA(process global area or private global area)。

    减少Oracle内存占用

    ### 减少Oracle内存占用 在Windows XP环境下运行Oracle 10g时,可能会遇到数据库占用内存过高的问题。这不仅会影响系统的稳定性,还可能导致其他应用程序因可用内存不足而受到影响。本文将详细介绍如何通过合理设置...

    oracle内存管理,深入浅出oracle内存管理,盖国强oracleppt

    Oracle数据库的内存管理是其高性能运行的关键因素之一。在深入理解Oracle内存管理的过程中,我们可以从以下几个方面进行探讨: ...通过合理的内存分配和管理,可以有效提升Oracle数据库的服务质量和响应速度。

    oracle内存全面分析

    Oracle的Memory Advisor提供内存调优建议,通过分析数据库的工作负载,给出优化内存分配的建议,以达到最佳性能。 三、内存分析方法 1. V$SGA动态视图 通过查询V$SGA视图,可以了解SGA各组件的当前大小、分配...

    Oracle 内存全面分析 PDF文档

    - **Memory Leaks**: 当内存分配过多而未被正确释放时,可能导致内存泄露,这会影响系统性能。通过监控SGA和PGA的大小变化,可以发现并解决此类问题。 - **Performance Issues**: 高CPU使用率、慢查询、频繁的磁盘...

Global site tag (gtag.js) - Google Analytics