博客
关于我
大规模数据生成 (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----线程、进程、协程的区别及多线程详解
    查看>>
    python---5
    查看>>
    python---使用celery分布式系统异步发送短信(云通讯)来验证登录
    查看>>
    python--003--百分号字符串拼接、format
    查看>>
    Python--10、线程
    查看>>
    Python--Redis实战:第四章:数据安全与性能保障:第4节:复制
    查看>>
    python--基本代码规范
    查看>>
    Python--抽象类接口类
    查看>>
    PYTHON--欧拉习题二
    查看>>
    python--高级应用总结
    查看>>
    python-520表白代码,我看谁说程序员不懂浪漫,送你几套表白代码,一步到位
    查看>>
    Python-Asyncio TypeError:无法在‘;等待‘;表达式中使用对象DICT
    查看>>
    Python-AttributeError:‘;dict&39;对象没有属性‘;序列‘;
    查看>>
    Python-ldap:是否可以在不显式写入密码的情况下进行绑定?
    查看>>
    python出现 unknown encoding: idna 的处理方法
    查看>>
    Python出现 RuntimeError: dictionary changed size during iteration 的解决方法
    查看>>
    Python-numpy(2)数组的操作
    查看>>
    Python-Numpy的tile函数用法
    查看>>
    python-open函数
    查看>>