汗,写上篇笔记已经是去年的事情了。时间过得真快啊,在这里已经工作了一年多了,感觉自己什么都没学到似的,或者说没有钻研过。从一开始用C,后来体验了 下Linux,学了点内核和Shell的皮毛,正打算将以后的方向定在unix平台/c语言开发的时候,猛然发现,在目前的岗位上,根本得不到什么应用。 遂弃之。如今选择了PL/SQL,就要精通业务逻辑,刚开始的这段时间尤其痛苦,这存储过程里的业务逻辑并不是那么容易看出的。加油吧。
人生啊,虚度年华,荒废光阴了。
上次配置好了环境,接下来,就要准备一个工具用来检测不同方法的性能差异。Tom大师建议我们开发人员都应该有个自己用来测试各种想法的测试数据库 (test bed), 我在其他的工作中也遵循了这样的做法,专门建立一个SandBox目录,本着“小马过河”的精神,检验自己的千奇百怪的猜想。
RunStats工具
作用是分析sql的实际性能,主要从三个方面来考查:
A. 墙上时钟(wall clock)/耗用时间(elapsed time):消耗时间;
B. 系统统计结果: 显示每个方法执行各步骤时发生的次数;
C. 闩定(latching):轻量级的锁,有点像多线程里的mutex,应用中应使内部闩越少越好,这样可以保证应用的可扩展性。
1. 创建视图
1 |
create or replace view stats |
2 |
as select 'STAT...' || a. name name , b.value |
3 |
from v$statname a, v$mystat b |
4 |
where a.statistic# = b.statistic# |
5 |
union all |
6 |
select 'LATCH.' || name , gets |
7 |
from v$latch; |
2. 创建临时表
1 |
create global temporary table run_stats |
2 |
( runid varchar2(15), |
3 |
name varchar2(80), |
4 |
value int |
5 |
) |
6 |
on commit preserve rows ; |
3. 创建RunStats包;
01 |
--runstat统计测试包 |
02 |
03 |
create or replace package runstats_pkg |
04 |
as |
05 |
procedure rs_start; |
06 |
procedure rs_middle; |
07 |
procedure rs_stop( p_difference_threshold in number default 0 ); |
08 |
end ; |
09 |
/ |
10 |
create or replace package body runstats_pkg |
11 |
as |
12 |
g_start number; |
13 |
g_run1 number; |
14 |
g_run2 number; |
15 |
|
16 |
procedure rs_start |
17 |
is |
18 |
begin |
19 |
delete from run_stats; |
20 |
|
21 |
insert into run_stats |
22 |
select 'before' , stats.* from stats; |
23 |
g_start := dbms_utility.get_time; |
24 |
end ; |
25 |
26 |
procedure rs_middle |
27 |
is |
28 |
begin |
29 |
g_run1 := (dbms_utility.get_time - g_start); |
30 |
|