v$sesstat视图和自开发工具

 

今天介绍一个Oracle中的重要性能视图v$sesstat,以及基于该视图自己开发的一个小性能评测工具包。

 

 

Oracle内部提供了很多监控性能的数据字典视图,用来帮助统计各种级别的性能统计量。其中,v$sesstat是我们经常使用到的一个视图。下面是Oracle官方文档中对该视图的解释。

 

V$SESSTAT displays user session statistics. To find the name of the statistic associated with each statistic number (STATISTIC#), query the V$STATNAME view.”

 

官方对该视图的解释很简单:就是现实用户会话统计量。当用户登录之后,该用户活动和消耗都会以统计量的方式汇总到该视图中。v$sesstat的结构很简单。

 

 

SQL> desc v$sesstat;

Name       Type   Nullable Default Comments

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

SID        NUMBER Y                        

STATISTIC# NUMBER Y                        

VALUE      NUMBER Y                        

 

 

其中,SID表示进行汇总统计的session编号,有这个编号也就意味着该视图中可以访问到多个会话的统计数据。如果当前存在会话编号,并且进行资源消耗和使用并且被记录下,这些信息是可以在v$sesstat视图中找到。但是,当会话结束,该视图中就不包括该会话的统计信息了。

 

 

statistic#列表是统计项目编号。在Oracle字典规范中,列名后带上#表示编号的意思。v$sesstat视图也是如此,statistic#列对应的统计项目的编号。而真正统计项目是什么,则需要对应v$statname进行匹配。

 

最后就是value值,表示的是消耗的统计值。

 

 

v$sesstat数据字典记录了一个尚在活动的session,从开始登陆起消耗的资源汇总量。当用户会话session结束,该资源统计量也就消失了。

 

 

至于统计事件v$statname数据视图,分别从不同的几个级别进行统计量汇总。

 

根据v$sesstat的特点,我们可以二次开发出一些小工具来帮助我们进行日常诊断和处理。下面我们就介绍一个自定义开发的小工具包,用来统计一系列数据库操作对资源的使用。

 

 

设计需求

 

我们进行Oracle代码编写调优的时候,常常会希望知道一个代码片段究竟消耗了多少资源?分别是消耗了那些资源?这种时候,v$sesstat是最好的一个数据来源。

 

 

设计思路

 

v$sesstat能够做到统计项目分类、会话独立的目的,但是唯一的缺点是记录累积量,也就是资源从会话开始到当前的消耗累积量。这时,可以使用snapshot的方法,在开始前保留一个资源信息快照作为一个基线。之后执行完再看变化量。

 

 

实现代码

 

实现该工具一共分为四个步骤。

 

1、构建全局的临时表,保存快照数据;

 

 

create global temporary table SYS_STATS

(

  STATISTIC# NUMBER(4),

  NAME       VARCHAR2(100),

  VALUE      NUMBER(20)

)

on commit preserve rows;

-- Add comments to the table

comment on table SYS_STATS

  is 'System Admin and Tunning Usage';

 

 

选择临时表的目的是防止会话数据之间进行相互数据干扰。选择on commit preserver rows的目的在于镜像之间消耗资源相互不影响。结构方面,sys_stats数据表和v$sesstat很像。

 

 

2、包体构建

 

以包方法的形式,进行方法控制。

 

create or replace package PCK_NBS_RUNSTATS is

 

  -- Public type declarations

  type t_tempstats is table of sys_stats%rowtype index by binary_integer;

 

  --start a snap for some session

  procedure start_snap(sid in number);

 

  --end a snap and output result

  procedure end_snap(sid in number);

 

end PCK_NBS_RUNSTATS;

 

(篇幅原因,只贴出了包声明部分内容。详细内容,请见附件文件下载)

 

 

实现使用的方法很简单。在进行操作之前,调用start_snap方法,参数为要监控session的编号。执行完操作之后,调用end_snap方法,汇总内容。如果sid参数输入为空,则表示统计当前的数值。最后,将消耗量保存在sys_stats数据表中,依据需要的形式进行展现。

 

 

3、结果查询

 

查询sys_stats数据表,就可以知道刚刚分析的数据统计量使用情况。还可以根据个人的情况,进行一定程度的排序。

 

 

 

使用实例

 

--开始监控

SQL> set serveroutput on size 10000;

SQL> exec pck_nbs_runstats.start_snap(null);

 

PL/SQL procedure successfully completed

 

 

SQL> select owner, count(*) from dba_objects group by owner;

 

OWNER                            COUNT(*)

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

MDSYS                                 885

(篇幅原因,省略)

OLAPSYS                               720

 

--结束镜像

SQL> exec pck_nbs_runstats.end_snap(null);

 

PL/SQL procedure successfully completed

 

 

检查sys_runstats数据表即可。比如我们希望知道刚才的分组group操作,资源消耗最大的四个操作是什么?

 

 

SQL> col name for a30;

SQL> select * from (select * from sys_stats order by value desc ) where rownum<5;

 

STATISTIC# NAME                                           VALUE

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

        26 session pga memory max                       1900544

        21 session uga memory max                       1642256

        25 session pga memory                            114044

       320 buffer is pinned count                         53302

 

 

很清楚,就可以看到刚才的操作。因为使用了group by分组,所以使用PGA空间的数量比较大。同时,存在大量数据块的读写pin操作,所以有一定的buffer pinned。

 

 

熟练掌握Oracle常用视图的功能和使用,适当的自己开发一些有用的工具。可以大大简化我们的日常工作,也可以增强我们对Oracle的了解。

 

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

转载于:http://blog.itpub.net/17203031/viewspace-691427/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值