博客
关于我
大规模数据生成 (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编程快速入门
    查看>>
    Python编程基础(附Pycharm与开发环境)
    查看>>
    python 如何“否定“value : 如果为真则返回假,如果为假则返回真
    查看>>
    Python 如何在 Web 环境中使用 Matplotlib 进行数据可视化
    查看>>
    python 如何把字符串转换成浮点数
    查看>>
    python 如果文件夹不存在就创建文件夹
    查看>>
    Python 如果有很多或以收缩形式
    查看>>
    Python 子进程 Popen 与 Pyinstaller
    查看>>
    Python 子进程 Popen.communicate() 等价于 Popen.stdout.read()?
    查看>>
    Python 子进程 Popen:为什么会出现“ls *.txt“?不行?
    查看>>
    Python 子进程参数
    查看>>
    python 字典 key 和value 互换
    查看>>
    Python 字典 vs If 语句速度
    查看>>
    python 字典sorted自定义排序,按照key or value排序
    查看>>
    python 字典和列表区别_元组列表和字典的主要区别是什么?
    查看>>
    python 字符串中特定字符替换,截取
    查看>>
    Python 字符串总结
    查看>>
    python 字符串显示中文_Python字符串开头的b"、u"、r"与中文乱码
    查看>>
    Python 字符串的几种拼装方式
    查看>>
    python 存入数据库bigint_python基础_MySQL的bigint类型
    查看>>