(轉)如何计算Oracle内存中的几个命中率

                                   如何计算几个命中率

 (1)LC的命中率:

.计算公式:Library Cache Hit Ratio = sum(pinhits) / sum(pins)

SELECTSUM(pinhits)/sum(pins)  
FROM V$LIBRARYCACHE

通常在98%以上,否则,需要要考虑加大共享池,绑定变量,修改cursor_sharing等参数。

.计算共享池内存使用率:

SELECT(1- ROUND(BYTES /(&TSP_IN_M *1024*1024),2))*100|| '%'
 
FROM V$SGASTAT
 
WHERENAME= 'free memory'
  
AND POOL = 'shared pool';

其中: &TSP_IN_M是你的总的共享池的SIZE(M)

共享池内存使用率,应该稳定在75%-90%间,太小浪费内存,太大则内存不足。

查询空闲的共享池内存:

SELECT*FROM V$SGASTAT
 
WHERENAME= 'free memory'
  
AND POOL = 'shared pool';

(2)PGA的命中率:

计算公式:BP x 100 / (BP + EBP)

BP: bytes processed

EBP: extrabytesread/written

SELECT*FROM V$PGASTAT WHERENAME='cache hit percentage';

或者从OEM的图形界面中查看

我们可以查看一个视图以获取Oracle的建议值:

SELECT round(PGA_TARGET_FOR_ESTIMATE/1024/1024) target_mb,

       ESTD_PGA_CACHE_HIT_PERCENTAGE cache_hit_perc,

       ESTD_OVERALLOC_COUNT

 FROM V$PGA_TARGET_ADVICE;

The output of this query might look like the following:

 TARGET_MB CACHE_HIT_PERC ESTD_OVERALLOC_COUNT

---------- -------------- --------------------

  63              23                   367

  125              24                    30

  250              30                     3

  375              39                     0

  500              58                     0

  600              59                     0

  700              59                     0

  800              60                     0

  900              60                     0

 1000              61                     0

 1500              67                     0

 2000              76                     0

 3000              83                     0

 4000              85                     0

在此例中:PGA至少要分配375M

我个人认为PGA命中率不应该低于50%

以下的SQL统计sql语句执行在三种模式的次数: optimal memory size, one-pass memory size, multi-pass memory size:

SELECT name profile, cnt, decode(total, 0, 0, round(cnt*100/total,4)) percentage
FROM (SELECT name, value cnt, (sum(value) over ()) total FROM V$SYSSTAT WHERE name like 'workarea exec%');

计算在内存中排序的比率:

SELECT * FROM v$sysstat t WHERE NAME='sorts (memory)'查询内存排序数
--
SELECT * FROM v$sysstat t WHERE NAME='sorts (disk)'查询磁盘排序数
--caculate sort in memory ratio
SELECT round(&sort_in_memory/(&sort_in_memory+&sort_in_disk),4)*100||'%' FROM dual

此比率越大越好,太小整要考虑调整,加大PGA

(3)db buffer cache命中率:

计算公式:hit ratio = 1 - [physical reads/(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
WHERE NAME='DEFAULT';

通常应在90%以上,否则,需要调整,加大DB_CACHE_SIZE

另外一种计算命中率的方法(摘自ORACLE官方文档<<数据库性能优化>>):

SELECT NAME, VALUE
 FROM V$SYSSTAT
 WHERE NAME IN('session logical reads',
               'physical reads',
               'physical reads direct',
               'physical reads direct (lob)',
               'db block gets', 'consistent gets');

命中率的计算公式为: Hit Ratio = 1 - ((physical reads - physical reads direct - physical reads direct (lob)) /

(db block gets + consistent gets - physical reads direct - physical reads direct (lob))

分别代入上一查询中的结果值,就得出了Buffer cache的命中率

-----------------------------------------------------------------------------

几个常用的检查语句

1.       查找排序最多的SQL:

SELECT HASH_VALUE, SQL_TEXT, SORTS, EXECUTIONS
  FROM V$SQLAREA
 ORDER BY SORTS DESC;

2.       查找磁盘读写最多的SQL:

SELECT * FROM

(SELECT sql_text,disk_reads "total disk" ,

executions "total exec",disk_reads/executions "disk/exec" FROM v$sql WHERE executions>0

and is_obsolete='N' ORDER BY 4 desc)

WHERE ROWNUM<11

3.       查找工作量最大的SQL(实际上也是按磁盘读写来排序的):

select
substr(to_char(s.pct, '99.00'), 2) || '%' load,
s.executions executes,
p.sql_text
from
(
select
address,
disk_reads,
executions,
pct,
rank() over (order by disk_reads desc) ranking
from
(
select
address,
disk_reads,
executions,
100 * ratio_to_report(disk_reads) over () pct
from
sys.v_$sql
where
command_type != 47
)
where
disk_reads > 50 * executions
) s,
sys.v_$sqltext p
where
s.ranking <= 5 and
p.address = s.address
order by
1, s.address, p.piec

 4.用下列SQL工具找出低效SQL:
SELECT EXECUTIONS , DISK_READS, BUFFER_GETS,

ROUND((BUFFER_GETS-DISK_READS)/BUFFER_GETS,2) Hit_radio,

ROUND(DISK_READS/EXECUTIONS,2) Reads_per_run,

SQL_TEXT

FROM V$SQLAREA

WHERE EXECUTIONS>0

AND BUFFER_GETS > 0

AND (BUFFER_GETS-DISK_READS)/BUFFER_GETS < 0.8

ORDER BY 4 DESC;

时间: 2024-10-01 23:34:01

(轉)如何计算Oracle内存中的几个命中率的相关文章

内存表-求高手解答,ORACLE 12C 中新加功能InMemory疑问

问题描述 求高手解答,ORACLE 12C 中新加功能InMemory疑问 在SQLPLUS中设置完一些表为InMemory之后,后面进行维护时,有没有方法可以获取到哪些表为InMemory表 我测试重复设置InMemory和no InMemory,SQLPLUS中也不会有错误信息 SQL> alter table test no inmemory; Table altered. SQL> alter table test no inmemory; Table altered. SQL>

Oracle内存分配中的子池(Subpool)--ORA-04031

Oracle内存分配中的子池(Subpool)--ORA-04031 在 Oracle 9i 和之后的版本,共享池可以被划分为子池.每个子池是一个小号的共享池,有它自己的空闲列表,内存结构条目,和LRU列表.这是一个对共享池和大池的可扩展性的改变,现在每一个子池都由一个 child latch 来保护,因此可以增加这些池的吞吐量.这意味着不再有之前版本的对于共享池和大池的单独 latch 的竞争.共享池中的保留区域也被平均的划分到每个子池中. 当你遇到 ora-04031 时,trace 会显示

【中亦安图】Oracle内存过度消耗风险提醒(6)

第一章 技术人生系列 · 我和数据中心的故事(第六期)-Oracle内存过度消耗风险提醒 中亦安图 | 2016-02-26 13:11 前言 时间过的真快,技术人生系列·我和数据中心的故事已经来到了第六期,小y又和大家见面了! 小y今天要和大家分享的是一个综合型问题的的分析和解决过程. 解决该类问题,只懂数据库是不够的,还需要掌握比较扎实的操作系统技能. 同时引出了另外一种不太常见形式的优化,内存优化. 由于今天要分享的问题具有普遍性,建议大家可以按照文中方法检查自己的系统中有无类似问题.分享

在AIX5.3中将Oracle SGA定在内存中的详细步骤

在一些操作系统平台中,我们可以将Oracle的SGA定在内存里,这样可以避免页交换,从而提高Oracle的性能.在AIX下,要把操作系统的v_pinshm参数设置为1,否则即使在Oracle中将LOCK_SGA设置为TRUE也是不管用的.然而仅仅知道这两个参数还远不够用的,必须对AIX内存管理有一定了解.本文要求操作系统是5.3 ML01以上,Oracle在9.2.0.4以上. 首先我们来检查一下操作系统版本: XXIBM:# oslevel -r 5300-07 可见操作系统版本满足我们的要求

Oracle内存结构(一)----SGA的区域信息

oracle SGA的区域信息   SGA(system global area)系统全局区跟一些必须的后台进程合进来称为实例(Instance).说它是全局区是包含了全局变量和数据结构,是系统区是包含了进入整个Oracle Instance的数据结构而不是特定的进程结构.   SGA区域:    SGA大概包括下面四到五种区域: The fixed area The variable area The database blocks area The log buffer The instan

检查Oracle数据库中不合理的sql语句

oracle|数据|数据库|语句 代码: select sql_text ,sharable_mem from v$sql where sharable_mem > '100000' order by sharable_mem ; 上面的sql语句是查询shared pool中占用内存超过100K的sql语句. 这个sql可以非常有效的检查出Oracle shared pool中那些严重占用内存的sql,根据我的经验,绝大多数有问题的sql语句都会在这里留下痕迹,通过在这里找出有问题的sql语句

Oracle内存结构(三)----Process Memory的详细信息

oracle The Process Memory: 除了SGA(System Global Area)之外,Oracle进程还使用下面三个全局区: The Process Global Area  (PGA) The User Global Area   (UGA) The Call Global Area   (CGA)   很多人都搞不清楚PGA和UGA两者之间的区别,实际上两者之间的区别跟一个进程和一个会话之间的区别是类似的.尽管说进程和会话之间一般都是一对一的关系,但实际上比这个更复杂

如何处理Oracle数据库中的坏块问题

oracle|数据|数据库|问题   本文主要介绍如何去处理在Oracle数据库中出现坏块的问题,对于坏块产生在不同的对象上,处理的方法会有所不同,本文将大致对这些方法做一些介绍.因为数据库运行时间长了,由于硬件设备的老化,出现坏块的几率会越来越大,因此,做为一个DBA,怎么去解决数据库出现的坏块问题就成了一个重要的议题了.   一:什么是数据库的坏块   首先我们来大概看一下数据库块的格式和结构 数据库的数据块有固定的格式和结构,分三层:cache layer,transaction laye

Oracle 10g中的闪回查询操作实例

与Oracle 9i相比Oracle 10g的Flashback有了非常大的改进,在Orcle 10g之前,SMON_SCN_TIME由SMON来获取和记录信息的,每5分钟记录一次,从Oracle 10g开始,LGWR首先会在SGA中记录SCN与时间的映射关系(由于LGWR至少每3秒就会被激活一次,所以现在SMON_SCN_TIME能够支持大于3秒的闪回),SMON则定期检查SGA是否内存中的映射大于磁盘上的,如果有就刷新纪录到磁盘, 而且从普通的Flashback Query发展到了多种形式,