大規模資料生成 (500萬條資料)
阿新 • • 發佈:2019-02-18
前言:
最近有一個作業需要 對 大規模資料 進行 效能測試
需要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) 操作的字串, 從多少位開始,取出的長度
::強制轉換
:=賦值運算子
--------------------------------------------------
每次隨機產生一位,把這些位數加起來,生成我們需要的資料。
捕獲異常,如果違反唯一性約束,繼續操作。