5

ID のない製品 (300 万アイテム) のリストがあります - タイトルのみです。しかし、どのタイトルがすでに DB に存在するかはわかりません。新規商品(約290万点)をDBに追加する必要があります。その後、各製品 (新規および既存) の ID を知る必要があります。

PostgreSQLでそれを行う最速の方法はありますか? 必要に応じて DB を変更できます (デフォルト値の追加、列の追加など)。

4

1 に答える 1

7

データのインポート

COPYすべてを一時ステージング テーブルに追加し、新しいタイトルのみをターゲット テーブルに挿入します。

CREATE TEMP TABLE tmp(title text);

COPY tmp FROM 'path/to/file.csv';
ANALYZE tmp;

INSERT INTO tbl
SELECT DISTINCT tmp.title
FROM   tmp 
LEFT   JOIN tbl USING (title)
WHERE  tbl.title IS NULL;

ID は のserialtbl_idで自動的に生成される必要がありますtbl

LEFT JOIN/コンストラクトは、IS NULL既存のタイトルを失格にします。NOT EXISTS別の可能性でしょう。

DISTINCT一時テーブル内の入力データの重複を防ぎますtmp

ANALYZEクエリ プランナーが適切なプランを選択し、一時テーブルが自動バキュームによって分析されないようにするのに役立ちます。

300 万のアイテムがあるため、temp_buffer(このセッションのみ)の設定を上げると費用がかかる場合があります。

SET temp_buffers = 1000MB;

または、余裕があり、一時テーブルをRAMに保持するのに十分な量で、はるかに高速です。注:セッションで最初に実行する必要があります-一時オブジェクトが作成される前に。

ID を取得する

インポートされたデータのすべての ID を表示するには:

SELECT tbl.tbl_id, tbl.title
FROM   tbl
JOIN   tmp USING (title)

同じセッションで!一時テーブルは、セッションの終了時に自動的に削除されます。

于 2013-04-05T13:06:12.643 に答える