1. 程式人生 > >大規模資料生成 (500萬條資料)

大規模資料生成 (500萬條資料)

前言:

最近有一個作業需要 對 大規模資料 進行 效能測試

需要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)  操作的字串, 從多少位開始,取出的長度

::強制轉換

:=賦值運算子

--------------------------------------------------

每次隨機產生一位,把這些位數加起來,生成我們需要的資料。

捕獲異常,如果違反唯一性約束,繼續操作。