web-dev-qa-db-ja.com

大きなCSVをPostgresにロードする

copyコマンドを使用して、約1億レコード(ディスク上で約8GB)のCSVをPostgresにロードしようとしています:copy mytable from 'path/to/myfile.csv' with CSV; pgAdminで報告されたテーブルサイズを確認し、CSVサイズと比較することで、進行状況を監視しています。それはせいぜい大まかな比較になるだろうと私は知っています、そして私は進歩を監視するより良い方法があるかどうか聞いてみたいです。

問題は次のとおりです。このロードはかなり長い間(長すぎると思います)続いており、テーブルサイズをチェックし続けると、ロードが減速しているように見えます。つまり、新しい100MBのデータをロードするのに、以前のロードよりもはるかに長い時間がかかります。どうして?

CSVを多数の小さなファイルに分割する以外に、読み込みを高速化するために実行できる調整、構成、または代替のアプローチはありますか?


更新:スキーマ/データの詳細

1つの代表的なデータ行:

1234567890,FOOBARF,2010-01-15 03:07:05,0.924700,0.925000

完全なスキーマ定義:

CREATE TABLE mytable
(
  id integer NOT NULL,
  rname character varying(7) NOT NULL,
  ts timestamp without time zone NOT NULL,
  stat1 numeric NOT NULL,
  stat2 numeric NOT NULL,
  CONSTRAINT pk_id PRIMARY KEY (id)
)
WITH (
  OIDS=FALSE
);
ALTER TABLE mytable OWNER TO postgres;
5
G__

インデックスを無効にできると、運が良くなる可能性があります。しかし、テーブルに関する十分な情報を提供しなかったため、これは良い答えではありません。

テーブル定義、制約、インデックス!!!、およびトリガーを投稿してください。

また、CSVデータが正しく、テーブルと一致していることを[確認]していますか?

2
Leo