前些天为了给系统做压力测试,要求每个部门的人员与角色随机并且分布合理平均,开始利用存储过程插入大数据随机量数据,此方法比较慢,效率低 本程序插入一百万条记录用时大约在500s,效率太低,最后总结了一下原因是因为大部分时间浪费在了产生随机数据上
最后改用JDBC,效率反而挺可观
#创建存储过程
drop procedure if exists insertPerson;#如果存在储存过程则删除
#delimiter $$ #创建一个储存过程
create procedure insertPerson()
begin
# @Job_Number; 工号
# @Person_Name; 姓名
# @Sex; 性别
# @BU_ID; 部门
# @Position_Code; 职位
# @PositionGrade_Code; 职级
# @ResType_Code; 资源类型
#@JoinIn_Date; 入职时间
# @Dimission_Date; 离职时间
# @Create_Time; 创建时间',
# @Org_ID; 组织编码',
# @Status1; 人员状态(0:删除,1:正常,2:被削减,3:离职)',
# @Verify_Flag; 人员信息验证状态,0-未验证,1-已验证',
# @person_type; 人员类别',
# @person_category; 人员类别,1:正式员工;2:试用员工;3:实习生',
SET @num=200001;
SET @count=1; #循环次数
SET @BU_ID=1;
while @count<1000001 do #如果@a<10001则返回true,继续执行
SET @Job_Number=CONCAT('E',@num); #工号
SET @Person_Name=rand_string(3); #姓名,随即赋值
SET @Sex=FLOOR(RAND()*2); #性别,随即赋值,0或者1
SET @Status1=FLOOR(RAND()*4);
SET @person_category=FLOOR(RAND()*3)+1;
SET @Verify_Flag=FLOOR(RAND()*2);
SET @Org_ID=FLOOR(RAND()*27+1);
SET @ResType_Code=FLOOR(RAND()*3+1);
SET @Create_Time='2013-12-25';
SET @JoinIn_Date=str_to_date('2013-01-01 00:00:00','%Y-%m-%d %H:%i:%s');
SET @Dimission_Date=date_add(@JoinIn_Date, interval 400 day);
insert into jf_t_person(Job_Number,Person_Name,Sex,BU_ID,Position_Code,PositionGrade_Code,ResType_Code,JoinIn_Date,Dimission_Date,
Create_Time,Org_ID,Status,Verify_Flag,person_type,person_category)
values(@Job_Number,@Person_Name, @Sex,@BU_ID,@Position_Code,@PositionGrade_Code,@ResType_Code,@JoinIn_Date,@Dimission_Date,@Create_Time,@Org_ID,@Status1,@Verify_Flag, @person_type,@person_category);
set @count=@count+1;
if @count%100=0 #每个部门一百人
then
set @BU_ID=@BU_ID+1;
end if;
SET @num=@num+1;
end while;
end
#delimiter ;
#执行存储过程插入数据
call insertPerson();
#创建一个随机产生字符串的函数
set global log_bin_trust_function_creators = 1;
DROP FUNCTION IF EXISTS rand_string;
#DELIMITER //
CREATE FUNCTION rand_string(n INT)
RETURNS VARCHAR(255)
BEGIN
DECLARE chars_str varchar(100) DEFAULT'冯海兵白宇贾蓉蓉灰太狼喜洋洋丽丽圆圆隆冬强倩倩玲玲任宏龚正曹彦斌齐如曹天野张王李冬冬赵东东';
DECLARE return_str varchar(255) DEFAULT 'preTest_';
DECLARE i INT DEFAULT 0;
WHILE i < n DO
SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*43 ),1));#52代表在52个字母中随即找出一个
SET i = i +1;
END WHILE;
#SET return_str='preTest_'+return_str;
RETURN return_str;
END
#delimiter ;
#创建一个随机产生字符串的函数,0和1随机出现
set global log_bin_trust_function_creators = 1;
DROP FUNCTION IF EXISTS rand_sex;
#DELIMITER //
CREATE FUNCTION rand_sex(n INT)
RETURNS VARCHAR(255)
BEGIN
DECLARE chars_str varchar(100) DEFAULT '01';
DECLARE return_str varchar(255) DEFAULT '';
DECLARE i INT DEFAULT 0;
WHILE i < n DO
SET return_str = concat(return_str,substring(chars_str , FLOOR(1 + RAND()*2 ),1));
SET i = i +1;
END WHILE;
RETURN return_str;
END
#delimiter ;