2011-11-03 10 views
0

基本的に3つのテーブルがあります。 1つはコアテーブル、もう1つは第1に依存します。私はすべてのテーブルに最大70000レコードを追加する必要があります。私はテーブルのために設定された制約(プライマリ&外部キー、インデックス、一意なものなど)を持っています。要件に標準の.csvファイルがないため、バルクインポート(COPYコマンドを使用)に行くことはできません。また、マッピングは明示的に必要とされ、Cベースのプログラミングファイルで外部からの検証はほとんど行われません。各レコードの詳細(最大70000)は、.pgc(ECPGベースのCプログラミングファイル)からpostgresqlファイルに渡されます。最初のいくつかのレコードでは時間がかからず、パフォーマンスは後者のレコードに悪くなっています。結果は非常に悲しい20000までカバーするまでに数日かかる!パフォーマンスの尺度は何ですか?私を案内してください。PostgreSQLの複数の挿入に最適化が必要

私のマスターテーブルのスキーマは

CREATE TABLE contacts 
(contact_id SERIAL PRIMARY KEY 
, contact_type INTEGER DEFAULT 0 
, display_name TEXT NOT NULL DEFAULT '' 
, first_name TEXT DEFAULT '' 
, last_name TEXT DEFAULT '' 
, company_name TEXT DEFAULT '' 
, last_updated TIMESTAMP NOT NULL DEFAULT current_timestamp 
, UNIQUE(display_name) 
) WITHOUT OIDS; 
+0

(ほぼ)空のテーブルから開始するときに測定しましたか?あなたの挿入物は1つの大きな取引で行われていますか?もしそうなら、キャッシュされたクエリプランが悪くなった可能性があります。 –

+2

個別の挿入を発行しても、20000行には日数がかかりません。大きなテーブルの場合でも、通常の挿入文を使用してラップトップに約5000行/秒を挿入できます。 –

+0

Plsは以下のメンバーに私の返信を読んでいます。あなたは時間消費を最小限にする方法について私を導くことができますか?私はpostgresql 8.1.4を持っています。 Linux OS。私のマスターテーブルのスキーマは、TABLEの連絡先( \t \t 、\t SERIAL PRIMARY KEY、 \t CONTACT_TYPE \t INTEGERのDEFAULT 0をcontact_id DISPLAY_NAME \t TEXT、NOT NULL DEFAULT 'を作成'、 \t FIRST_NAME \t TEXTのDEFAULT ''、 \t LAST_NAME \t TEXTですDEFAULT ''、 \t COMPANY_NAME \t TEXTのDEFAULT ''、 \tはNULL DEFAULTのCURRENT_TIMESTAMPをlast_updatedです\t TIMESTAMP NOT、 \t UNIQUE(DISPLAY_NAME) )OIDSなし; – Siva

答えて

1

ドロップ/ディスエーブルインデックス/トリガで、COPYを使用します。これを使用して数百万行のデータと数ギガバイトのデータを数分でインポートします。

ドキュメントはここに深さでこれをカバーする:あなたはそれを正しい方法を行う場合http://www.postgresql.org/docs/9.1/static/populate.html

Postgresは、バルクロードデータで素晴らしいです。

+0

私はマスタテーブルのフィールドに一意性とインデックスの制約があるので、COPYを使うことはできないと思います。複数の挿入の前にそれらを削除すると、意味をなさないでしょう!また、何らかの理由で重複したレコードや失敗したレコードを別のファイルに記録する必要があります。これは私の要件です。したがって、私のCプログラムファイルは、インポートファイルからすべてのデータ(レコード)をコピーし、各レコードを構造体に渡します。これはSQL関数に渡され、テーブルに挿入されます。ファイルをインポートするのに70000レコードがある場合は、70000コールまたはトランザクションで70000レコードを渡します。 – Siva

関連する問題