1、浅谈存储过程在性能测试中的应用 Ⅰ.背景介绍: 在信息化时代的今天,信息管理软件日益发展强大。随着数据量的激增,人们对于软件的性能越来越关注。性能测试变得越来越重要。负载和数据容量测试是重要的性能测试类型。如何快速创建大量的有效数据成为性能测试的前提条件。在本文中,我们结合oracle数据库介绍一种快速插入数据的方法,即存储过程构造数据法。这种方法应用方便,直接在数据库端编写和运行代码,方便调试和维护,为性能测试创造有利的数据条件。 Ⅱ.存储过程的定义: 存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是由流控制
2、和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中,存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量 。同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。在oracle中,复杂的应用规则和业务可以作为过程存储。存储过程是一组sql和pl/sql语句,它允许我们把加强的业务规则从应用移动到数据库中。存储过程允许被重复使用,使用存储过程大大提高数据的访问效率和提升应用系统的性能。 Ⅲ.存储过程使用前提: 为了创建一个过程对象,必须拥有创建procedure的系统权限。如果此过程对象在另一个用户的领域中,则必须拥有create any p
3、rocedure的权限。因为存储过程与数据库的表关联,所以过程的所有者必须对表有操作权限,而执行这些过程对象的用户并不需要在所给予的表上拥有特权,仅需要excute权限即可。 Ⅳ.存储过程应用于性能测试实例: 某系统为该市中考考生成绩查询系统。该市共有将近10万名考生,要求在查询成绩显示时间不大于5秒。 1. 下面是基本的性能测试流程: 来看“数据准备”这一过程,根据这一需求进行性能测试。要模拟10万名考生,显然通过系统逐条录入数据不太现实。这里通过存储过程将很轻松的解决这个问题。 2. 分析数据库中相关的表结构: 在插入有关联关系的表的数据时,首先要理清表
4、之间的关联。从上图关联关系中可以看出: (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; ② 创建科目表序列供引用: Cr
5、eate 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); Student
6、school 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_‘||student
7、id||’’’’; 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_s
8、ubject 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||
9、’’’)’; 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(2
10、0); 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 cu
11、r2%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给出
12、很多错误提示,这个时候一定不要着急,按照提示信息,逐行检查语法错误即可。有时候,调试的过程不报错,但是执行完了数据库中却没有数据,这一定是存储过程存在问题,才导致数据不能正常插入,所以还要检查。经过反复调试,最后成功执行。待执行成功后,学生表,考试科目表和成绩表的数据已经创建完毕,这时可以继续进行性能测试。 ⅴ.小结: 存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译。性能测试是个反复的过程,而且确定需求后一般不会发生变更。这样,我们可以充分利用存储过程的优点:只要我们第一轮性能测试前准备好数据,以后只是执行即可,不需要重复准备这个过程。因此在性能测试中运用存储过程插入数据是一种不错的方法。






