今天介绍一个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/