儲存過程批量插入隨機資料
阿新 • • 發佈:2019-01-11
前些天為了給系統做壓力測試,要求每個部門的人員與角色隨機並且分佈合理平均,開始利用儲存過程插入大資料隨機量資料,此方法比較慢,效率低 本程式插入一百萬條記錄用時大約在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 @ [email protected]+1;
if @count%100=0 #每個部門一百人
then
set @[email protected]_ID+1;
end if;
SET @[email protected]+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 ;