加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – 批量插入数亿条记录

发布时间:2020-12-13 15:51:05 所属栏目:百科 来源:网络整理
导读:将2.37亿条记录插入到具有规则的表中(用于跨子表分发数据)的最快方法是什么? 我试过或考虑过: 插入语句. 事务性插入(BEGIN和COMMIT). COPY FROM命令. http://pgbulkload.projects.postgresql.org/ 插入太慢(四天)而COPY FROM忽略规则(并有其他问题). 示例
将2.37亿条记录插入到具有规则的表中(用于跨子表分发数据)的最快方法是什么?

我试过或考虑过:

>插入语句.
>事务性插入(BEGIN和COMMIT).
> COPY FROM命令.
> http://pgbulkload.projects.postgresql.org/

插入太慢(四天)而COPY FROM忽略规则(并有其他问题).

示例数据:

station_id,taken,amount,category_id,flag
1,'1984-07-1',4,1,'1984-07-2','1984-07-3','1984-07-4',T

表结构(包含一个规则):

CREATE TABLE climate.measurement
(
  id bigserial NOT NULL,station_id integer NOT NULL,taken date NOT NULL,amount numeric(8,2) NOT NULL,category_id smallint NOT NULL,flag character varying(1) NOT NULL DEFAULT ' '::character varying
)
WITH (
  OIDS=FALSE
);
ALTER TABLE climate.measurement OWNER TO postgres;

CREATE OR REPLACE RULE i_measurement_01_001 AS
    ON INSERT TO climate.measurement
   WHERE date_part('month'::text,new.taken)::integer = 1 AND new.category_id = 1 DO INSTEAD  INSERT INTO climate.measurement_01_001 (id,station_id,flag)
  VALUES (new.id,new.station_id,new.taken,new.amount,new.category_id,new.flag);

数据最初是在MySQL中,但出于性能原因(并利用PL / R扩展)必须切换到PostgreSQL.

谢谢!

解决方法

将输入拆分为数据库外部的单独文件,并使用COPY上载每个文件,而不是依赖规则来分发它们.如果你给出的规则是任何一个例子,那就是要应用的简单文本转换.此外,如果您的磁盘系统符合要求,则前面拆分将允许您并行加载拆分文件.

说真的,不要依赖规则来为批量加载执行此分发.实际上总是这样的情况下,批量加载和事务加载需要不同的方法,除非你准备暴力强制一个或另一个(通常,等待).

例如,您的规则使用date_part()从日期中提取月份 – 因此,为了确定子表,postgres需要分析日期字符串,将其转换为时间戳,然后将时间戳转换回日历让月份字段再次退出.但是,如果你正在写一些事情来预先做这件事,你可以做substr($date,5,2)(或等价物):你觉得哪个会更快?

这也是一个清理数据格式的机会,因此COPY会接受它.请注意,您可以使用COPY命令指定列:如果您没有使用该架构和示例文件执行该操作,则由于前面的额外“id”列而导致错误. (“从csv标题中复制”可能已经计算出来,但可能不是……“标题”选项可能只是让它跳过第一行).

我在几个小时内自己将大约280e6行加载到postgresql实例中,所以这当然不是不可能的.对于这个初始加载,我已经关闭了fsync = off;计划是加载积压,然后再次将其重新打开以进行常规日常装载.我必须设置checkpoint_segments = 40以避免在日志中收到检查点警告.这只是加载到我的开发机器上 – 我正在使用专用磁盘用于数据库,这与用于xlogs的磁盘不同(即我在大磁盘上创建了一个表空间并在该表空间内创建了数据库).实例的shared_buffers设置为1Gb,checkpoint_target设置为0.5.我尝试并行加载一些分区并没有提供太多改进,所以我怀疑慢速磁盘是瓶颈而不是数据库本身.

再过一次1.7e9行…应该在明天的某个时候完成我希望.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读