runstats工具是《 oracle database 9i/10g/11g编程艺术 深入数据库体系结构》作者写的一个统计性能工具,能对做同一件事的两个方法进行比较,得到孰优孰劣的结果。

(看到runstats想到了db2 里有runstats命令收集统计信息)

runststs工具主要测量三个要素

  • 墙上时钟(wall clock) 或耗用时间(elapsed time)
  • 系统统计结果,会并排地显示每个方法做某件事(如执行一个解析调用)的次数,并展示出二者之差
  • 闩定(latch)这个是报告的关键输出

要使用该工具,需要能访问V$视图,并创建一个表来存储统计结果,还需要创建runstats包,下面是在scott用户下创建该工具,以下试验在ORACLE 11.2.0.1.0上进行

使用SYS用户登录,执行以下语句

--默认scott无创建视图权限,创建视图时会报ORA-01031: insufficient privileges
grant create view to scott;
--将以下4个动态性能视图原表SELECT权限赋给scott
grant SELECT on v_$statname to scott ;
grant SELECT on v_$mystat to scott ;
grant SELECT on v_$latch to scott ;
grant SELECT on v_$timer to scott ;

scott用户下登录,执行以下语句

--创建统计结果表
create or replace view stats
as select 'STAT...' || a.name name, b.value
from sys.v_$statname a, sys.v_$mystat b
where a.statistic# = b.statistic#
union all
select 'LATCH.' || name, gets
from sys.v_$latch
union all
select 'STAT...Elapsed Time', hsecs from sys.v_$timer; --创建临时表收集统计结果
create global temporary table run_stats
(runid varchar2(15),
name varchar2(80),
value int)
on commit preserve rows; --创建runstats包
-- runstats包含3个API,runstats测试开始时调用rs_start,rs_middle会在测试中调用,完成时调用rs_stop,打印报告
-- rs_stop的p_difference_threshold参数,用来控制最后打印的数据量,输入这个参数可只查看差值大于参数的统计结果和闩信息,默认为0全部显示 create or replace package runstats_pkg
as
procedure rs_start;
procedure rs_middle;
procedure rs_stop(p_difference_threshold in number default 0);
end ;
/ create or replace package body runstats_pkg
as
g_start number;
g_run1 number;
g_run2 number; --清空统计结果表,插入上一次统计结果,获取当前定时器值
procedure rs_start
is
begin
delete from run_stats; insert into run_stats
select 'before', stats.* from stats;
g_start := dbms_utility.get_cpu_time;
end; procedure rs_middle
is
begin
g_run1 := (dbms_utility.get_cpu_time-g_start); insert into run_stats
select 'after 1', stats.* from stats;
g_start := dbms_utility.get_cpu_time; end; --打印每次运行累计CPU时间,分别打印两次运行的统计结果和闩值(只打印超过p_difference_threshold的结果)
procedure rs_stop(p_difference_threshold in number default 0)
is
begin
g_run2 := (dbms_utility.get_cpu_time-g_start); dbms_output.put_line
( 'Run1 ran in ' || g_run1 || ' cpu hsecs' );
dbms_output.put_line
( 'Run2 ran in ' || g_run2 || ' cpu hsecs' );
if ( g_run2 <> 0 )
then
dbms_output.put_line
( 'run 1 ran in ' || round(g_run1/g_run2*100,2) ||
'% of the time' );
end if;
dbms_output.put_line( chr(9) ); insert into run_stats
select 'after 2', stats.* from stats; dbms_output.put_line
( rpad( 'Name', 30 ) || lpad( 'Run1', 12 ) ||
lpad( 'Run2', 12 ) || lpad( 'Diff', 12 ) ); for x in
( select rpad( a.name, 30 ) ||
to_char( b.value-a.value, '999,999,999' ) ||
to_char( c.value-b.value, '999,999,999' ) ||
to_char( ( (c.value-b.value)-(b.value-a.value)),
'999,999,999' ) data
from run_stats a, run_stats b, run_stats c
where a.name = b.name
and b.name = c.name
and a.runid = 'before'
and b.runid = 'after 1'
and c.runid = 'after 2' and abs( (c.value-b.value) - (b.value-a.value) )
> p_difference_threshold
order by abs( (c.value-b.value)-(b.value-a.value))
) loop
dbms_output.put_line( x.data );
end loop; dbms_output.put_line( chr(9) );
dbms_output.put_line
( 'Run1 latches total versus runs -- difference and pct' );
dbms_output.put_line
( lpad( 'Run1', 12 ) || lpad( 'Run2', 12 ) ||
lpad( 'Diff', 12 ) || lpad( 'Pct', 10 ) ); for x in
( select to_char( run1, '999,999,999' ) ||
to_char( run2, '999,999,999' ) ||
to_char( diff, '999,999,999' ) ||
to_char( round( run1/decode( run2, 0,
to_number(0), run2) *100,2 ), '99,999.99' ) || '%' data
from ( select sum(b.value-a.value) run1, sum(c.value-b.value) run2,
sum( (c.value-b.value)-(b.value-a.value)) diff
from run_stats a, run_stats b, run_stats c
where a.name = b.name
and b.name = c.name
and a.runid = 'before'
and b.runid = 'after 1'
and c.runid = 'after 2'
and a.name like 'LATCH%'
)
) loop
dbms_output.put_line( x.data );
end loop;
end; end;
/

工具创建好了之后,可以拿个例子来测试一下,把下面语句写入test.sql,做成一个SQL文件,sqlplus中执行

drop table testStat;
create table testStat(id varchar2(10));
exec runstats_pkg.rs_start;
exec dbms_output.put_line('rs_start....');
insert into testStat select level from dual connect by level <=500000;
commit;
exec dbms_output.put_line('insert completed....');
exec runstats_pkg.rs_middle;
exec dbms_output.put_line('rs_middle....');
begin
for i in 1 .. 500000
loop
insert into testStat values (i);
end loop;
commit;
end;
/
exec dbms_output.put_line('loop insert....');
exec runstats_pkg.rs_stop(0);

结果如下:

[oracle@RHEL65 test]$ sqlplus scott/oracle@orcl @t.sql

SQL*Plus: Release 11.2.0.1.0 Production on Sat Jan 30 16:54:09 2016

Copyright (c) 1982, 2009, Oracle.  All rights reserved.

Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options Table dropped. Table created. PL/SQL procedure successfully completed. rs_start.... PL/SQL procedure successfully completed. 500000 rows created. Commit complete. insert completed.... PL/SQL procedure successfully completed. PL/SQL procedure successfully completed. rs_middle.... PL/SQL procedure successfully completed. PL/SQL procedure successfully completed. loop insert.... PL/SQL procedure successfully completed. Run1 ran in 66 cpu hsecs
Run2 ran in 2217 cpu hsecs
run 1 ran in 2.98% of the time Name Run1 Run2 Diff
STAT...opened cursors current -1 0 1
STAT...redo synch writes 2 1 -1
STAT...commit txn count during 2 3 1
STAT...IMU Flushes 2 1 -1
STAT...rows fetched via callba 5 4 -1
STAT...cursor authentications 0 1 1
STAT...buffer is pinned count 1 2 1
STAT...parse time elapsed 1 0 -1
LATCH.channel handle pool latc 2 1 -1
LATCH.queued dump request 0 1 1
LATCH.MinActiveScn Latch 0 1 1
LATCH.Shared B-Tree 1 2 1
LATCH.hash table modification 1 0 -1
LATCH.SQL memory manager latch 0 1 1
LATCH.kwqbsn:qsga 0 1 1
LATCH.threshold alerts latch 0 1 1
STAT...IMU pool not allocated 0 2 2
STAT...IMU- failed to get a pr 0 2 2
STAT...SQL*Net roundtrips to/f 10 8 -2
LATCH.ksuosstats global area 0 2 2
LATCH.dml lock allocation 2 4 2
STAT...user calls 15 12 -3
STAT...sorts (memory) 11 8 -3
STAT...sorts (rows) 5 2 -3
LATCH.object stats modificatio 7 4 -3
LATCH.kcbtsemkid latch 0 3 3
LATCH.managed standby latch 0 3 3
LATCH.parameter list 0 3 3
LATCH.session state list latch 3 0 -3
LATCH.session switching 1 5 4
LATCH.ksv allocation latch 0 4 4
LATCH.sort extent pool 0 4 4
LATCH.deferred cleanup latch 0 4 4
LATCH.cp sga latch 0 4 4
LATCH.parallel query alloc buf 1 5 4
LATCH.ncodef allocation latch 0 4 4
LATCH.qmn task queue latch 0 4 4
LATCH.ASM network state latch 0 4 4
STAT...write clones created in 0 5 5
STAT...immediate (CURRENT) blo 14 9 -5
LATCH.resmgr:active threads 0 5 5
LATCH.resmgr:schema config 0 5 5
LATCH.job_queue_processes para 0 5 5
STAT...table scans (short tabl 6 12 6
STAT...table scan blocks gotte 4 10 6
LATCH.FAL Queue 0 6 6
LATCH.alert log latch 0 6 6
LATCH.reservation so alloc lat 0 6 6
LATCH.transaction allocation 15 8 -7
LATCH.OS process allocation 0 9 9
LATCH.KMG MMAN ready and start 0 9 9
LATCH.Change Notification Hash 0 9 9
LATCH.Real-time plan statistic 0 9 9
STAT...redo buffer allocation 0 10 10
STAT...physical read total IO 2 13 11
STAT...physical reads 2 13 11
STAT...physical reads cache 2 13 11
STAT...physical read IO reques 2 13 11
LATCH.cache buffer handles 1,064 1,076 12
LATCH.archive control 0 12 12
LATCH.Reserved Space Latch 0 12 12
LATCH.session timer 0 12 12
LATCH.kks stats 1 15 14
LATCH.shared pool simulator 10 24 14
STAT...Heap Segment Array Upda 23 8 -15
STAT...switch current to new b 31 14 -17
STAT...calls to get snapshot s 188 171 -17
STAT...cluster key scans 51 34 -17
STAT...cluster key scan block 51 34 -17
STAT...index scans kdiixs1 88 105 17
STAT...deferred (CURRENT) bloc 32 14 -18
LATCH.FIB s.o chain latch 0 18 18
STAT...consistent changes 63 44 -19
STAT...table fetch by rowid 31 50 19
STAT...shared hash latch upgra 50 70 20
LATCH.archive process latch 0 21 21
LATCH.space background task la 0 21 21
STAT...consistent gets - exami 888 912 24
STAT...index fetch by key 52 28 -24
LATCH.FOB s.o list latch 2 26 24
STAT...commit cleanouts 867 842 -25
STAT...commit cleanouts succes 861 836 -25
STAT...no work - consistent re 146 171 25
STAT...workarea memory allocat -46 -21 25
LATCH.session idle bit 35 63 28
STAT...hot buffers moved to he 0 29 29
LATCH.In memory undo latch 15 45 30
STAT...buffer is not pinned co 277 312 35
STAT...redo log space requests 0 40 40
LATCH.SGA IO buffer pool latch 2 45 43
LATCH.DML lock allocation 139 93 -46
LATCH.post/wait queue 3 51 48
LATCH.active service list 0 51 51
LATCH.file cache latch 46 108 62
STAT...cleanout - number of kt 744 817 73
STAT...active txn count during 743 816 73
LATCH.call allocation 8 82 74
LATCH.active checkpoint queue 9 84 75
LATCH.session allocation 12 115 103
LATCH.ASM db client latch 2 106 104
LATCH.object queue header heap 22 132 110
LATCH.Consistent RBA 15 129 114
LATCH.lgwr LWN SCN 15 129 114
LATCH.mostly latch-free SCN 15 131 116
STAT...table scan rows gotten 50 176 126
LATCH.message pool operations 4 130 126
STAT...enqueue releases 280 409 129
STAT...enqueue requests 280 409 129
STAT...enqueue conversions 3 147 144
LATCH.JS queue state obj latch 0 180 180
STAT...messages sent 14 202 188
STAT...file io wait time 66 276 210
STAT...non-idle wait count 21 251 230
STAT...redo log space wait tim 0 355 355
STAT...IMU undo allocation siz 712 1,080 368
STAT...change write time 3 403 400
LATCH.redo writing 49 486 437
STAT...bytes sent via SQL*Net 2,379 1,894 -485
LATCH.row cache objects 1,062 1,577 515
STAT...non-idle wait time 2 534 532
LATCH.SQL memory manager worka 7 610 603
LATCH.channel operations paren 15 694 679
LATCH.redo allocation 52 751 699
STAT...bytes received via SQL* 3,942 3,228 -714
STAT...calls to kcmgcs 1,795 1,027 -768
STAT...consistent gets from ca 2,060 1,290 -770
STAT...consistent gets 2,060 1,290 -770
STAT...consistent gets from ca 1,087 287 -800
STAT...db block gets from cach 2,252 1,216 -1,036
LATCH.messages 63 1,136 1,073
LATCH.enqueues 348 1,422 1,074
LATCH.enqueue hash chains 566 1,722 1,156
STAT...recursive cpu usage 5 1,912 1,907
STAT...CPU used when call star 66 2,217 2,151
STAT...CPU used by this sessio 66 2,217 2,151
STAT...Elapsed Time 68 2,751 2,683
STAT...DB time 67 2,751 2,684
STAT...Heap Segment Array Inse 2,779 14 -2,765
STAT...free buffer requested 1,063 5,148 4,085
STAT...redo subscn max counts 1,021 5,124 4,103
STAT...calls to kcmgas 300 4,409 4,109
STAT...redo ordering marks 233 4,369 4,136
LATCH.simulator lru latch 114 4,520 4,406
LATCH.undo global data 1,065 5,517 4,452
STAT...free buffer inspected 0 4,479 4,479
LATCH.cache buffers lru chain 187 5,401 5,214
LATCH.checkpoint queue latch 221 6,512 6,291
STAT...IMU Redo allocation siz 540 11,212 10,672
LATCH.object queue header oper 2,563 25,027 22,464
LATCH.simulator hash latch 949 36,561 35,612
STAT...session cursor cache hi 78 41,324 41,246
STAT...physical read bytes 16,384 106,496 90,112
STAT...cell physical IO interc 16,384 106,496 90,112
STAT...physical read total byt 16,384 106,496 90,112
STAT...HSC Heap Segment Block 2,813 500,029 497,216
STAT...redo entries 6,853 504,649 497,796
STAT...recursive calls 1,443 501,196 499,753
STAT...execute count 172 500,170 499,998
STAT...opened cursors cumulati 159 500,162 500,003
LATCH.shared pool 219 500,325 500,106
STAT...session logical reads 12,488 516,953 504,465
STAT...db block gets 10,428 515,663 505,235
STAT...db block gets from cach 10,428 515,663 505,235
STAT...session pga memory 524,288 -196,608 -720,896
STAT...session uga memory 785,856 -196,464 -982,320
STAT...db block changes 10,145 1,009,164 999,019
LATCH.cache buffers chains 41,525 2,576,396 2,534,871
STAT...session pga memory max 24,772,608 0 -24,772,608
STAT...session uga memory max 24,843,448 0 -24,843,448
STAT...undo change vector size 1,210,048 34,006,444 32,796,396
STAT...redo size 8,857,832 124,592,660 115,734,828 Run1 latches total versus runs -- difference and pct
Run1 Run2 Diff Pct
50,679 3,171,932 3,121,253 1.60% PL/SQL procedure successfully completed. scott@ORCL>

oracle编程艺术--runstst工具的更多相关文章

  1. Oracle编程艺术--配置环境

    如何设置login.sql,参照了本书作者的意见,我也大概弄明白了 只是该文件的存放位置一直就出错,百度了很久,说是$ORACLE_HOME/sqlplus/admin/glogin.sql(默认)于 ...

  2. 转《UNIX编程艺术》读书心得

    花了一段时间看完了<UNIX编程艺术>,但不是看得特别仔细,尤其是后面作者通过对工具的讲解来阐述其设计思想,因为很多工具能未曾接触过,难免就会产生一些乏味的感觉.其实就像译者姜宏在译序里说 ...

  3. Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译)

    # 禅与 Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译) - 原文 <https://githu ...

  4. C#编程的最佳工具

    C#是企业中广泛使用的编程语言,特别是那些依赖微软的程序语言.如果您使用C#构建应用程序,则最有可能使用Visual Studio,并且已经寻找了一些扩展来对您的开发进行管理.但是,这个工具列表可能会 ...

  5. R语言编程艺术(4)R对数据、文件、字符串以及图形的处理

    本文对应<R语言编程艺术> 第8章:数学运算与模拟: 第10章:输入与输出: 第11章:字符串操作: 第12章:绘图 =================================== ...

  6. R语言编程艺术(3)R语言编程基础

    本文对应<R语言编程艺术> 第7章:R语言编程结构: 第9章:面向对象的编程: 第13章:调试 ============================================== ...

  7. Oracle编程入门经典 第12章 事务处理和并发控制

    目录 12.1          什么是事务处理... 1 12.2          事务处理控制语句... 1 12.2.1       COMMIT处理... 2 12.2.2       RO ...

  8. Oracle编程入门经典 第11章 过程、函数和程序包

    目录 11.1          优势和利益... 1 11.2          过程... 1 11.2.1       语法... 2 11.2.2       建立或者替换... 2 11.2 ...

  9. UNIX编程艺术

    本文主要是 <UNIX编程艺术>的摘录,摘录的主要是我觉得对从事软件开发有用的一些原则. 对于程序员和开发人员来说,如果完成某项任务所需要付出的努力对他们是个挑战却又恰好还在力所能及的范围 ...

随机推荐

  1. Unix系统编程()发送信号的其他方式:raise和killpg

    有时,进程需要向自身发送信号,raise 函数就执行了这一任务. #include <signal.h> int raise(int sig); 在单线程程序中,调用raise相当于对ki ...

  2. go web框架推荐

    https://blog.usejournal.com/top-6-web-frameworks-for-go-as-of-2017-23270e059c4b https://www.zhihu.co ...

  3. 02 java 程序环境

    java 安装与设置 1. 安装 jdk 2. 设置执行路径 unix: set path=(/usr/local/jdk/bin $path) ( 在~/.cshrc文件里增加) linux: ex ...

  4. Linux - 静默安装oracle数据库总结

    Web服务器上面的Linux一般是不会有图形界面的,所有通过图形界面来安装Linux的方式在没有图形界面的Linux上面是行不通的,我们要使用的安装方式叫做Linux的静默安装.即在没有图形界面的Li ...

  5. jquery可拖动表格调整列格子的宽度大小(转)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. Request获取具有相同 name 属性表单元素值

    html代码如: <input name="txtName" id="txtFirstName" type="text" /> ...

  7. (转)session、cookie与“记住我的登录状态”的功能的实现

    Cookie的机制 Cookie是浏览器(User Agent)访问一些网站后,这些网站存放在客户端的一组数据,用于使网站等跟踪用户,实现用户自定义功能. Cookie的Domain和Path属性标识 ...

  8. LoadRunner小技巧集锦

    preftest 性能测试工作室,专注于性能测试技术研究(www.AutomationQA.com) LoadRunner小技巧集锦 1.录制脚本中包含中文,出现乱码怎么办? 把录制选项中的Suppo ...

  9. 【Openwrt】刷

    设定你的电脑ip 为192.168.1.100 网线一头连接lan口,另外一头连接电脑.WAN口不能插线. 按住路由器的qss 键,开启路由器的电,灯灭掉,等6秒左右灯会再次闪几下就松开,用googl ...

  10. MathType中如何快速输入空心字母

    MathType输入数学公式时非常方便有效的,在文档中涉及到数学公式或者符号时都是使用MathType来进行的,因为它比Office自带的公式编辑器功能更为完善,使用起来更快捷.在数学公式中,在不同的 ...