• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    postgres 使用存储过程批量插入数据的操作

    参考官方文档

    create or replace function creatData2() returns 
    boolean AS
    $BODY$
    declare ii integer;
     begin
     II:=1;
     FOR ii IN 1..10000000 LOOP
     INSERT INTO ipm_model_history_data (res_model, res_id) VALUES (116, ii);
     end loop;
     return true;
     end;
    $BODY$
    LANGUAGE plpgsql;
    select * from creatData2() as tab;

    插入1千万条数据耗时610s,当然字段不多的情况下。

    补充:Postgresql存储过程--更新或者插入数据

    要记录某一时段机器CPU、内存、硬盘的信息,展示的时间粒度为分钟,但是为了精确,输入数据源的时间粒度为6s。这个统计过程可以在应用层做好,每分钟插入一次,也可以在数据库层写个存储过程来完成,根据传入数据的时间来判断是更新数据库旧数据还是插入新数据。

    同时,这些数据只需要保留一周,更老的数据需要被删除。删除动作可以每天定时执行一次,也可以写在存储过程中每次检查一下。

    考虑到性能在此时没什么太大约束,而后面存储过程的接口方式更漂亮些,不用应用层去关心数据到底组织成什么样,因此实现了一个如下:

    Postgresql V8.3
    CREATE OR REPLACE FUNCTION insert_host_status(_log_date timestamp without time zone, _host inet, _cpu integer, _mem integer, _disk integer)
     RETURNS void AS
    $BODY$
    DECLARE
      new_start timestamp without time zone;
      current_start timestamp without time zone;
      c_id integer;
      c_log_date timestamp without time zone;
      c_cpu integer;
      c_mem integer;
      c_disk integer;
      c_count integer;
      date_span interval;
    BEGIN
      -- insert or update
      SELECT id, log_date, cpu, mem, disk, count INTO c_id, c_log_date, c_cpu, c_mem, c_disk, c_count FROM host_status_byminute WHERE host=_host ORDER BY id DESC limit 1;
      SELECT timestamp_mi(_log_date, c_log_date) INTO date_span;
      IF date_span >= '00:00:60' OR c_id IS NULL THEN
        INSERT INTO host_status_byminute (log_date, host, cpu, mem, disk, count) values (_log_date, _host, _cpu, _mem, _disk, 1);
      ELSIF date_span >= '-00:00:60' THEN
        c_mem := ((c_mem * c_count) + _mem)/(c_count + 1);
        c_cpu := ((c_cpu * c_count) + _cpu)/(c_count + 1);
        c_disk := ((c_disk * c_count) + _disk)/(c_count + 1);
        c_count := c_count + 1;
        UPDATE host_status_byminute SET mem=c_mem, cpu=c_cpu, disk=c_disk, count=c_count WHERE id=c_id;
      END IF;
      -- delete old data
      SELECT date_mii(date(now()), 6) INTO new_start;
      SELECT date(log_date) from host_status_byminute limit 1 INTO current_start; -- omit a bug happened when date is disordered.
      IF new_start > current_start THEN
        DELETE FROM host_status_byminute where log_date  new_start;
      END IF;
    END;
    $BODY$
     LANGUAGE 'plpgsql' VOLATILE
     COST 100;
    ALTER FUNCTION insert_host_status(timestamp without time zone, inet, integer, integer, integer) OWNER TO dbuser_test;
    

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    您可能感兴趣的文章:
    • 使用postgresql 模拟批量数据插入的案例
    • PostgreSQL upsert(插入更新)数据的操作详解
    • 使用Postgresql 实现快速插入测试数据
    • postgreSQL数据库 实现向表中快速插入1000000条数据
    • Python随机生成数据后插入到PostgreSQL
    上一篇:Postgresql 查询表引用或被引用的外键操作
    下一篇:PostgreSql 重建索引的操作
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    postgres 使用存储过程批量插入数据的操作 postgres,使用,存储,过程,