我正在尝试对数据库中的某些表进行一些性能负载测试。我们使用的方法基本上是一个循环插入语句的脚本。但是,我们想知道系统每分钟可以处理多少次插入。目前,我的脚本看起来像这样:
set serveroutput on
variable n number
exec :n := dbms_utility.get_time
begin
for i in 1..5000 loop
insert into aoms.buyers (user_id,buyer_cd,buyer_eng_nm,reg_dt)
values(dbms_random.string('L',8),'LT0','LT04','LT05');
end loop;
end;
/
exec :n := (dbms_utility.get_time - :n)/100
exec dbms_output.put_line(:n)
我不想在脚本上安装计时器,而是希望在60秒内插入尽可能多的记录。如何才能做到这一点?另外,如果我想让这个脚本本质上更具动态性,并且能够在具有不同结构(列名,主键)的不同表上使用它,我将如何处理它。可能吗?感谢。
答案 0 :(得分:2)
这将持续60秒:
set serveroutput on
variable n number
exec :n := dbms_utility.get_time + (6 * 100);
declare
l_cnt NUMBER := 0;
begin
loop
insert into aoms.buyers (user_id,buyer_cd,buyer_eng_nm,reg_dt)
values(dbms_random.string('L',8),'LT0','LT04','LT05');
l_cnt := l_cnt + SQL%ROWCOUNT;
exit when dbms_utility.get_time > :n;
end loop;
dbms_output.put_line('Rows inserted: ' || l_cnt);
end;
/
你需要确保这是一个公平的测试。例如,DBMS_RANDOM.STRING()
需要时间。致电DBMS_UTILITY
需要时间。您可能希望将此与DBMS_HPROF
结合使用,以确切了解插入所花费的时间。
另一方面,您的生产系统可能不仅仅是插入。
至于使事情变得更通用,只需将INSERT INTO AOMS.BUYERS...
替换为您正在运行的任何测试。我不会比这更通用了。例如,假设您使用接受“table_name”作为参数的函数调用替换了插入,然后查找列,每个列的数据类型,并找出每列的良好测试数据。所有这些工作(在我看来)可能会扭曲你的测试结果。