博客
关于我
大规模数据生成 (500万条数据)
阅读量:753 次
发布时间:2019-03-23

本文共 1902 字,大约阅读时间需要 6 分钟。

最近有一个作业需要对大规模数据进行性能测试。我需要处理500万条数据,这是一个很大的量,直接通过CSV文件导入数据库显然不可行。

直接使用循环_insert会显著影响性能,效率会非常慢。想到用存储过程来实现batch插入,希望能够提升效率。

以下是存储过程的实现代码:

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         -- 生成用户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;                  -- 生成用户名(字母数字组合)         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;$LANGUAGE 'plpgsql';

执行命令:select insert_users_test();

这个存储过程能够有效处理大规模数据插入任务。以下是一些关键点:

  • randomsid:通过随机选择数字生成用户ID,这确保了唯一性。
  • randomna_id:通过混合字母和数字生成用户名,同样保证了唯一性。
  • FOR循环:在循环中同时生成ID和用户名,以减少外部访问数据库的次数。

这个解决方案具有以下优点:

  • 性能提升:把单次插入改为批量处理,可以显著减少时间。
  • 避免独占资源:避免了长时间占用 recounted资源,防止性能被其他查询影响。
  • 异常处理:如果ID clashes发生,存储过程会重复尝试,直到插入成功。
  • 需要注意的是,对于每批数据XOTIFY操作以及监控执行时间进行优化是很重要的。

    这个方案在设计时尽量减少了直接访问数据库的次数,同时通过随机生成数据确保了唯一性。思考充分考虑了数据库性能和数据生成的需求,是一项可行且高效的方案。

    转载地址:http://nlwzk.baihongyu.com/

    你可能感兴趣的文章
    Python关于Paginator分页函数详细解析 附实战代码
    查看>>
    python3、ipython3、setup-tools、pip等环境搭建详细总结
    查看>>
    python3下使用cv2.imwrite存储带有中文路径图片或者绝对路径图片
    查看>>
    python3与django中@property详解
    查看>>
    python3中如何表示无穷大
    查看>>
    Python3中提示:no module named 'wxpy'
    查看>>
    python3中选择文件对话框的格式打开和保存图片
    查看>>
    python3为什么print永远都是地址_Python3 print 函数用法总结
    查看>>
    Python3之uuid模块
    查看>>
    Python3之写入Excel文档(xlsxwriter)
    查看>>
    Python3之打印操作打印流重定向(下)
    查看>>
    python3判断字典、列表、元组为空以及字典是否存在某个key的方法
    查看>>
    Python3利用pymysql操作 MySQL
    查看>>
    python3处理json文件中含有中文dumps的应用
    查看>>
    Python3子进程输出
    查看>>
    Python3学习笔记3,变量、运算符
    查看>>
    Python3学习笔记(urllib模块的使用)
    查看>>
    python3安装scapy_Linux下安装scapy-python3
    查看>>
    python3实现socket通信
    查看>>
    Python关于numpy.transpose函数详细解析附代码
    查看>>