资源描述
浅谈存储过程在性能测试中的应用
Ⅰ.背景介绍:
在信息化时代的今天,信息管理软件日益发展强大。随着数据量的激增,人们对于软件的性能越来越关注。性能测试变得越来越重要。负载和数据容量测试是重要的性能测试类型。如何快速创建大量的有效数据成为性能测试的前提条件。在本文中,我们结合oracle数据库介绍一种快速插入数据的方法,即存储过程构造数据法。这种方法应用方便,直接在数据库端编写和运行代码,方便调试和维护,为性能测试创造有利的数据条件。
Ⅱ.存储过程的定义:
存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量 。同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。在oracle中,复杂的应用规则和业务可以作为过程存储。存储过程是一组sql和pl/sql语句,它允许我们把加强的业务规则从应用移动到数据库中。存储过程允许被重复使用,使用存储过程大大提高数据的访问效率和提升应用系统的性能。
Ⅲ.存储过程使用前提:
为了创建一个过程对象,必须拥有创建procedure的系统权限。如果此过程对象在另一个用户的领域中,则必须拥有create any procedure的权限。因为存储过程与数据库的表关联,所以过程的所有者必须对表有操作权限,而执行这些过程对象的用户并不需要在所给予的表上拥有特权,仅需要excute权限即可。
Ⅳ.存储过程应用于性能测试实例:
某系统为该市中考考生成绩查询系统。该市共有将近10万名考生,要求在查询成绩显示时间不大于5秒。
1. 下面是基本的性能测试流程:
来看“数据准备”这一过程,根据这一需求进行性能测试。要模拟10万名考生,显然通过系统逐条录入数据不太现实。这里通过存储过程将很轻松的解决这个问题。
2. 分析数据库中相关的表结构:
在插入有关联关系的表的数据时,首先要理清表之间的关联。从上图关联关系中可以看出:
(1)首先构造学生基本表的数据,学生ID是主键,这里引用序列作为ID;
(2)构造考试科目表的数据,科目ID是主键,引用科目序列作为ID;
(3)构造成绩表的数据,成绩表引用学生表的ID和科目表ID作为成绩表的外键,这里运用游标来实现;
3. 编写脚本过程:
⑴ 创建序列:
① 创建学生表序列供引用:
Create sequence student_seq
Minvalue 1
Maxvalue 1000000
Start with 1
Increament by 1
Nocache;
② 创建科目表序列供引用:
Create sequence subject_seq
Minvalue 1
Maxvalue 10000
Start with 1
Increament by 1
Nocache;
⑵ 用存储过程依次创建学生基本信息表、科目表、成绩表的数据:
① 创建学生表数据:
create or replace procedure pro_student
is
Studentid varchar2(20);
Studentname varchar2(20);
Studentsex varchar2(20);
Studentage varchar2(20);
Studentschool varchar2(100);
Txtsql varchar2(1000);
Layer1 number;
Begin
For layer1 in 1..100000 loop
Txtsql := ‘insert into student ( student_id,student_name,student_sex,student_age,student_school ) values (’;
Select student_seq.nextval into studentid from dual;
Studentname := ‘,‘‘STU_‘||studentid||’’’’;
Studentsex := ‘,‘‘女’’’;
Studentage := ‘,‘‘14’’’;
Studentschool := ‘,‘‘育民中学’’) ’;
Txtsql := txtsql || studentid || studentname || studentsex || studentage || studentschool;
Excute immediate txtsql;
Commit;
End loop;
End pro_student;
② 创建科目表数据:
create or replace procedure pro_subject
is
Subjectid varchar2(20);
Subjectname varchar2(20);
Txtsql varchar2(1000);
Layer2 number;
Begin
For layer2 in 1..10 loop
Txtsql := ‘insert into subject ( subject_id,subject_name) values (’;
Select subject_seq.nextval into subjecid from dual;
Subjectname := ‘,‘‘SUB_‘||subjectid||’’’)’;
Txtsql := txtsql || subjectid || subjectname;
Excute immediate txtsql;
Commit;
End loop;
End pro_subject;
③ 创建成绩表:
create or replace procedure pro_score
is
cursor cur1 is select s.student_id from student s;
cursor cur2 is select t.subject_id from subject t;
studentid varchar2(20);
Subjectid varchar2(20);
Begin
Open cur1;
Loop
Begin
Fetch cur1 into studentid;
Exit when cur1%notfound;
Open cur2;
Loop
begin
Fetch cur2 into subjectid;
Exit when cur2%notfound;
Insert into score (student_id,subject_id,score) values (studentid,subjectid, ‘100’);
Commit;
End;
End loop;
Close cur2;
End;
End loop;
Close cur1;
End pro_score;
⑶ 调试和执行存储过程。在调试的过程中,如果oracle给出很多错误提示,这个时候一定不要着急,按照提示信息,逐行检查语法错误即可。有时候,调试的过程不报错,但是执行完了数据库中却没有数据,这一定是存储过程存在问题,才导致数据不能正常插入,所以还要检查。经过反复调试,最后成功执行。待执行成功后,学生表,考试科目表和成绩表的数据已经创建完毕,这时可以继续进行性能测试。
ⅴ.小结:
存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译。性能测试是个反复的过程,而且确定需求后一般不会发生变更。这样,我们可以充分利用存储过程的优点:只要我们第一轮性能测试前准备好数据,以后只是执行即可,不需要重复准备这个过程。因此在性能测试中运用存储过程插入数据是一种不错的方法。
展开阅读全文