oracle编程艺术--runstst工具
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工具的更多相关文章
- Oracle编程艺术--配置环境
如何设置login.sql,参照了本书作者的意见,我也大概弄明白了 只是该文件的存放位置一直就出错,百度了很久,说是$ORACLE_HOME/sqlplus/admin/glogin.sql(默认)于 ...
- 转《UNIX编程艺术》读书心得
花了一段时间看完了<UNIX编程艺术>,但不是看得特别仔细,尤其是后面作者通过对工具的讲解来阐述其设计思想,因为很多工具能未曾接触过,难免就会产生一些乏味的感觉.其实就像译者姜宏在译序里说 ...
- Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译)
# 禅与 Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译) - 原文 <https://githu ...
- C#编程的最佳工具
C#是企业中广泛使用的编程语言,特别是那些依赖微软的程序语言.如果您使用C#构建应用程序,则最有可能使用Visual Studio,并且已经寻找了一些扩展来对您的开发进行管理.但是,这个工具列表可能会 ...
- R语言编程艺术(4)R对数据、文件、字符串以及图形的处理
本文对应<R语言编程艺术> 第8章:数学运算与模拟: 第10章:输入与输出: 第11章:字符串操作: 第12章:绘图 =================================== ...
- R语言编程艺术(3)R语言编程基础
本文对应<R语言编程艺术> 第7章:R语言编程结构: 第9章:面向对象的编程: 第13章:调试 ============================================== ...
- Oracle编程入门经典 第12章 事务处理和并发控制
目录 12.1 什么是事务处理... 1 12.2 事务处理控制语句... 1 12.2.1 COMMIT处理... 2 12.2.2 RO ...
- Oracle编程入门经典 第11章 过程、函数和程序包
目录 11.1 优势和利益... 1 11.2 过程... 1 11.2.1 语法... 2 11.2.2 建立或者替换... 2 11.2 ...
- UNIX编程艺术
本文主要是 <UNIX编程艺术>的摘录,摘录的主要是我觉得对从事软件开发有用的一些原则. 对于程序员和开发人员来说,如果完成某项任务所需要付出的努力对他们是个挑战却又恰好还在力所能及的范围 ...
随机推荐
- telnet 登陆的方法
第一种方式:通过inetd启动telnetd服务 必须这样设置busybox配置 Networking Utilities ---> 去掉 [ ] Support sta ...
- BZOJ 3922 - Karin的弹幕
Karin的弹幕 Problem's Link ---------------------------------------------------------------------------- ...
- js实现EasyUI-datagrid前台分页
//实现假分页 function myLoader(param, success, error) { var that = $(this); var opts = that.datagrid(&quo ...
- 在项目中使用JMail发送邮件
1.添加JMail组件:在vs的解决方案资源管理器中,右键添加引用,选择浏览,选择jmail.dll文件,在Bin文件夹中就可以看到添加的JMail组件. 2.注册JMail组件:开始-->运行 ...
- $ -----JavaScript 中美元符号 $ 的作用
JavaScript 中美元符号 $ 是什么 1.首先可以用来表示变量,比如变量 var s='asdsd'或var $s='asdasd'; 2.在正则表达式中,它可以匹配结尾:/sa$/.test ...
- 开源 java CMS - FreeCMS2.2 建站向导
项目地址:http://www.freeteam.cn/ 建站向导 为了方便用户创建网站,系统提供了建站向导功能. 从左側管理菜单点击建站向导进入. 第一步:创建网站 能够直接设置所属的父网站.填写相 ...
- 自己动手写CPU之第九阶段(2)——载入存储指令说明2(lwl、lwr)
将陆续上传新书<自己动手写CPU>.今天是第38篇,我尽量每周四篇,可是近期已经非常久没有实现这个目标了.一直都有事,不好意思哈. 开展晒书评送书活动,在q=%E4%BA%9A%E9%A9 ...
- Hadoop1.2.1 日志格式说明及启停方式
日志格式: 日志名称解析: Hadoop启停的三种方式: . 停止后面的以此类推...... 另外 hadoop-daemons.sh 表示启动多个,比如datanode跟tasktracker在真实 ...
- 阿里云CentOS6.8安装MySQL5.6
1.使用SSH Secure Shell工具连接阿里云服务器 2.使用SSH Secure File Transfer工具上传MySQL压缩包 3.解压MySQL压缩包到指定目录(需要在先/usr/l ...
- C语言数组元素的查询
在实际开发中,经常需要查询数组中的元素.例如,学校为每位同学分配了一个唯一的编号,现在有一个数组,保存了实验班所有同学的编号信息,如果有家长想知道他的孩子是否进入了实验班,只要提供孩子的编号就可以,如 ...