命中率模型是在owi之前比较常用的一种诊断性能问题的方法,通过命中率的计算,发现系统中的一些设置是否合理,当命中率不高的时候,通过调整一些参数和设置,提高命中率,有效的提高系统的性能和吞吐量。但当系统的命中率很高的时候,系统的性能问题和瓶颈就无法使用命中率模型来有效的定位,因为命中率说到底是一种平均值,而均值会隐藏系统的问题,这里暂且讨论oracle系统上几个相关的命中率的计算。另外会再讨论owi模型。

在awi的报告中,首先是oracle实例和snapshot信息,然后就是report summary,最后是main report。

  

Report summary一共包含:

  1. load profile:机器的负载情况
  2. Instance Efficiency Percentages (Target 100%):这个即命中率模型计算的各项命中率
  3. Shared Pool Statistics:shared pool的统计信息
  4. Top 5 Timed Events:owi模型给出的top 5等待事件

Load  profile这一块内容放到oracle性能量化里单独进行讨论

Top 5 Timed Events这一块放到owi模型里讨论

下面根据Report summary中提到的ratio模型来看看各个组件的命中率查询方法。

Instance Efficiency Percentages (Target 100%)
Buffer Nowait %: 99.99 Redo NoWait %: 100.00
Buffer Hit %: 99.03 In-memory Sort %: 100.00
Library Hit %: 99.99 Soft Parse %: 100.00
Execute to Parse %: 45.50 Latch Hit %: 99.83
Parse CPU to Parse Elapsd %: 0.60 % Non-Parse CPU: -74,999,900.00
  1. share pool命中率

  

share pool顾名思义是共享池,oracle设计的一个理念(concept),尽最大可能资源共享,oracle数据库的设计上处处可以看到这样的设计,share pool是,整个sga也是,服务器进程mts模式的设计也是。

共享带来的好处:

  1,  节省空间,为了提高数据,这些空间都使用内存,而内存有限,所以共享可以节省空间

  2,  减少重复的开销,比如sql的解析,如果不共享,每个服务器进程都要parse sql。

共享引入的开销:

资源的共享,在并发的时候,就要保证数据的一致性,而这就要求对共享资源的访问修改必须串行,当前,实现并发对共享资源访问的方法,基本上使用的都是锁的模式。所以,共享会引入管理的复杂度,即锁并发的管理,好的锁得实现,可以最小粒度的减少串行化,提高并发量。

1.1  dictionary cache

  

dictionary cache存放username,segment, profile data, tablespace ,sequence numbers,metadata等数据字典信息。

V$rowcache:

  1.   Gets:请求的次数
  2.   Getmisses:请求未命中,产生了I/O
  3.   Modifications:被更新的次数

Dictionary cache命中率的计算:

  

select PARAMETER, sum(gets), sum(getmisses), sum(gets-getmisses)/sum(gets), sum(modifications) from v$rowcache where gets>0
2 group by parameter; PARAMETER SUM(GETS) SUM(GETMISSES) SUM(GETS-GETMISSES)/SUM(GETS) SUM(MODIFICATIONS)
-------------------------------- ---------- -------------- ----------------------------- ------------------
dc_constraints 26105 17709 .32162421 25985
dc_tablespaces 671821624 332 .999999506 3
dc_tablespace_quotas 361936 1821 .994968724 38936
dc_awr_control 490926 11 .999977593 12374
dc_object_grants 422828 20466 .95159734 0
dc_histogram_data 61172551 789981 .987086022 99819
dc_rollback_segments 155350233 336 .999997837 299
dc_sequences 8448387 28616 .996612845 8448383
dc_usernames 220455977 4395 .999980064 50
dc_segments 12950991 869311 .932876874 306741
dc_objects 64257294 593589 .990762309 204066
dc_database_links 98889512 348 .999996481 48
dc_histogram_defs 226295391 2692490 .988101879 558557
dc_table_scns 4085 1621 .603182375 17
dc_hintsets 4 4 0 0
dc_users 1080674219 1936 .999998209 4027
dc_qmc_cache_entries 4 3 .25 0
outstanding_alerts 726430 221 .999695772 19
dc_files 160769 1577 .990190895 20
dc_object_ids 107109518 319172 .997020134 42773
dc_global_oids 13917214 5956 .999572041 858
dc_profiles 42888582 4 .999999907 1
global database name 1522 40 .973718791 0 23 rows selected.

1.2  library cache

  

library cache存放sql cursors, pl/sql programs, java classes等,主要是应用相关的代码,即这里存放着可执行代码。

V$librarycache

  Reload:               因为空间不足或其它原因被aged out。

  Invalidations: 因为失效,而从新parse or compile。

使用下面的sql查询:

Xpchild/xpchild@orcl>select namespace, pins, pinhits,reloads, invalidations from v$librarycache order by 1;

NAMESPACE             PINS    PINHITS    RELOADS INVALIDATIONS
--------------- ---------- ---------- ---------- -------------
BODY 174437675 174432698 2615 0
CLUSTER 237743 237312 281 0
INDEX 9702979 9629171 37528 0
JAVA DATA 1396 1392 0 0
JAVA RESOURCE 5082 3569 215 0
JAVA SOURCE 5389 3858 262 0
OBJECT 0 0 0 0
PIPE 15862 15779 0 0
SQL AREA 3253149334 3215928721 10753752 535924
TABLE/PROCEDURE 620436845 619644445 352466 0
TRIGGER 208535856 208522398 7590 0

  

Library cache的命中率的计算方法:

Library cache Hit Ratio =sum(pinhits)/sum(pins)

例如:

Xpchild/xpchild@orcl>select sum(pinhits)/sum(pins) from v$librarycache;

SUM(PINHITS)/SUM(PINS)
----------------------
.991068196 1 row selected.

1.3 Shared pool空间中空闲空间的查看

  

Xpchild/xpchild@orcl>select * from  v$sgastat where name='free memory' and pool='shared pool';

POOL         NAME                                BYTES
------------ ------------------------------ ----------
shared pool free memory 699561872

2, buffer cache

  

根据v$db_cache_advice来调整data_buffer的大小,但会给系统增加额外的开销,这里默认advice都是关闭的。

1,计算开机以来总的buffer cache hit ratio的方法:

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(*) DESC

当在awr里计算的每个snapshot的命中率,是根据interval时间段来取v$sysstat的采样值进行计算而得。

2,计算单独的buffer pool的hit ratio:

select name, DB_BLOCK_GETS,CONSISTENT_GETS,PHYSICAL_READS from v$buffer_pool_statistics;

这里得到每个buffer pool的命中率。

3, 段使用的buffer pool情况

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(*) DESC

4,段使用的buffer pool的百分比

根据3计算得到的块数,下面再计算当前的buffer pool的大小。

 select name, BLOCK_SIZE , BUFFERS from v$buffer_pool;

所以buffer pool的命中率和其它的计算牵涉到几个动态视图:

  1. v$bh:buffer pool每一个块的情况
  2. v$sysstat:系统上统计的物理读和逻辑读的情况
  3. v$buffer_pool:每一个buffer pool的大小情况
  4. v$buffer_pool_statistics:每一个buffer pool的逻辑读和物理读情况

3   parse

使用v$sysstat统计信息来得到parse相关的统计

Select name, value
From v$sysstat
where name in ('parse time cpu' , 'parse time elapsed' , 'parse count (hard)', 'CPU used by this session');
NAME VALUE
------------------------------ ----------
CPU used by this session 199863525
parse time cpu 195376
parse time elapsed 355588
parse count (hard) 15455146

Tips:

Large pool分配:

  1,  mts分配uga

  2,  并行执行,进程间消息缓冲

  3,  备份,rman磁盘I/O缓存区。

Cache sequence number可以减少dictionary cache lock的使用,

相同的sql,绑定变量的名称也必须相同。

如果使用mts,那么每一个session会使用10k的shared pool的空间。

oracle命中率模型计算的更多相关文章

  1. oracle时间模型

    Oracle在9i或者早期的版本,对于性能优化方面,主要采用命中率模型,后面的版本,也保留着命中率模型,比如在awr报告中,Instance Efficiency Percentages (Targe ...

  2. 虚拟机VMWARE上ORACLE License 的计算

    Oracle License的计算有两种方式:按照用户数和CPU个数. 其中按CPU计算方式如下: License Number = The Number of CPU Cores  *  Core ...

  3. Oracle时间日期计算--计算某一日期为一年中的第几周

    Oracle时间日期计算--计算某一日期为一年中的第几周 select to_char(sysdate-10,'yyyymmdd')||':iw:'||to_char(sysdate-10,'iw') ...

  4. 基于MATLAB实现的云模型计算隶属度

    ”云”或者’云滴‘是云模型的基本单元,所谓云是指在其论域上的一个分布,可以用联合概率的形式(x, u)来表示 云模型用三个数据来表示其特征 期望:云滴在论域空间分布的期望,一般用符号Εx表示. 熵:不 ...

  5. MySQL 模拟Oracle邻接模型树形处理

    数据库对层次结构的处理模型有好多种,能够依据自己的需求来设计模型.当然最简单的也是最easy设计的模型就是所谓的邻接模型.在这方面,其它数据库比方Oracle 提供了现成的分析方法 connect b ...

  6. 经典CNN模型计算量与内存需求分析

    表1 CNN经典模型的内存,计算量和参数数量对比 AlexNet VGG16 Inception-v3 模型内存(MB) >200 >500 90-100 参数(百万) 60 138 23 ...

  7. oracle 周岁年龄计算

    以下三种方法均可实现周岁年龄的计算: --算法一: SELECT TRUNC(months_between(sysdate, csrq)/12) AS "Age" FROM wrx ...

  8. oracle 命中率

    一般在I/O 使用中,为了提高系统处理速度,系统提前将数据读入一块内存区,叫高速缓存,但提前读入的数据未必就是需要的,这就是命中率..计算公式为 命中率=1-(physical reads/(db b ...

  9. oracle笔记之计算年龄、工龄和TRUNC

    方法一:利用months_between 函数计算 SELECT TRUNC(months_between(sysdate, birthday)/12) AS agefrom dual; 方法二:日期 ...

随机推荐

  1. Linux基础1之磁盘与分区

    Linux上面设备皆文件,目前需要知道的,比如U盘和SARA硬盘的在Linux上面的文件名,/dev/sd[a-p].与IDE接口不同的是,SATA/USB接口的磁盘没有一定的顺序,这里就根据Linu ...

  2. linux下神奇的script命令

    script 是一个神奇命令,script 能够将终端的会话过程录制下来,然后使用 scriptreplay 就可以将其录制的结果播放给他人观看.script 的好处就在于你在终端中的所有操作.敲过的 ...

  3. spring学习笔记之spring框架本质

    Spring框架的本质是,开发者在Spring配置文件中使用XML元素进行配置,实际驱动Spring执行相应的代码: 使用<bean.../>元素,实际启动Spring执行无参或有参构造函 ...

  4. IOS 学习笔记 2015-03-22 OC-API-日期

    一 API 1 NSdate 2 NSDateFormatter 二 适用场景 1 获取当前日期 2 增加时间差 3 比较时间差 4 返回较早时间 5 日期格式话 6 日期转字符串 7 字符串转日期 ...

  5. JQ封装切换滚动功能

    /*---------控制滚动图片v1(作者:SFLYQ)-----------Options 配置对象,(用来配置控制元素的dom位置,初始化一些必要的对象或者方法)DoIni 初始化操作(初始化元 ...

  6. document.getElementById获取不到标签值

    var apliay=document.getElementById('apliay_ok'); 代码里指定有id="apliay_ok"的标签,但是获取不到,折腾半天原来是因为在 ...

  7. 在Laravel5.* 中使用 AdminLTE

    在Laravel5.* 中使用 AdminLTE AdminLTE是一个很棒的单纯的由 HTML 和 CSS 构建的后台模板,在这片文章中,我将讲述如何将 AdminLTE 和 Laravel 优雅的 ...

  8. lucene解决全文检索word2003,word2007的办法

    在上一篇文章中 ,lucene只能全文检索word2003,无法检索2007,并且只能加载部分内容,无法加载全文内容.为解决此问题,找到了如下方法 POI 读取word (word 2003 和 wo ...

  9. 警惕arm-linux-gcc编译器优化选项

    arm-linux-gcc的优化选项例如(-O2),可以加速我们的程序,使程序执行效率更高.但是,倘若我们就是需要程序慢一点运行,但是优化却把我们的延时函数优化的没有了的时候,这种优化却不是我们想要的 ...

  10. sql 判断一个表的数据不在另一个表中

    SELECT a.* FROM a LEFT JOIN b ON a.key = b.key WHERE (b.key IS NULL) end as flag from a select id fr ...