【发布时间】:2011-02-20 00:11:34
【问题描述】:
将 2.37 亿条记录插入具有规则(用于跨子表分布数据)的表中的最快方法是什么?
我已经尝试或考虑过:
- 插入语句。
- 事务性插入(
BEGIN和COMMIT)。 -
COPY FROM命令。 - http://pgbulkload.projects.postgresql.org/
插入速度太慢(四天),COPY FROM 忽略规则(还有其他问题)。
示例数据:
station_id,taken,amount,category_id,flag
1,'1984-07-1',0,4,
1,'1984-07-2',0,4,
1,'1984-07-3',0,4,
1,'1984-07-4',0,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, taken, amount, category_id, flag)
VALUES (new.id, new.station_id, new.taken, new.amount, new.category_id, new.flag);
数据最初在 MySQL 中,但出于性能原因(并利用 PL/R 扩展)必须切换到 PostgreSQL。
谢谢!
【问题讨论】:
-
将 2.37 亿行插入到任何表中,无论是否有规则都需要一段时间......这是一大堆数据。
-
4 天有点过头了,是的...不知道,以前没有使用过 Postgre。祝你好运。我假设这是一次一次性的操作?有什么东西阻止你让它运行 4 天吗?
标签: postgresql bulkinsert