前言:
最近有一个作业需要 对 大规模数据 进行 性能测试
需要500万条数据,这是一个很大的量,我们无法通过cvs文件这种方式把数据导入数据库
我开始想到了一个解决方案,使用java程序,循环500万次,执行更新语句,把数据插入到数据库中。
这种方式虽然方便了操作,但是效率一定很慢。
下面给出最优的解决方案
使用存储过程,进行数据插入
CREATE OR REPLACE FUNCTION insert_users_test()
RETURNS void AS
$BODY$
DECLARE
randomsid text;
randomna_id text;
p_source text:= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
p_sourceN text:= '0123456789';
p_length int := 9;
w_result text := '';
w_index int := 0;
curtime timestamp;
enttime timestamp;
BEGIN
FOR i IN 1..5000000 LOOP
BEGIN
-- user_id 文字列生成(数字组合)
w_result := '';
w_index := 0;
p_length := 9;
FOR i IN 1..p_length LOOP
w_index := floor(random() * length(p_sourceN))::integer + 1;
w_result := w_result || substring(p_sourceN, w_index, 1);
END LOOP;
randomsid := w_result;
-- user_name 文字列生成(字母数字组合)
p_length := 8;
w_result := '';
w_index := 0;
FOR i IN 1..p_length LOOP
w_index := floor(random() * length(p_source))::integer + 1;
w_result := w_result || substring(p_source, w_index, 1);
END LOOP;
randomna_id := w_result;
curtime := 'now';
enttime := curtime + '-1 hours';
INSERT INTO user(user_id, user_name, enttime, utdate_time)
values (randomsid, randomna_id ,last_login_time , curtime);
EXCEPTION WHEN unique_violation THEN
NULL;
END;
END LOOP;
END;
$BODY$
LANGUAGE 'plpgsql';
执行 select insert_users_test();
对于以上一些用法的说明
random() 取出 0到1之间的随机数
length(str) 返回字符串的长度
substring(str,beginIndex,length) 操作的字符串, 从多少位开始,取出的长度
::强制转换
:=赋值运算符
--------------------------------------------------
每次随机产生一位,把这些位数加起来,生成我们需要的数据。
捕获异常,如果违反唯一性约束,继续操作。