ID のない製品 (300 万アイテム) のリストがあります - タイトルのみです。しかし、どのタイトルがすでに DB に存在するかはわかりません。新規商品(約290万点)をDBに追加する必要があります。その後、各製品 (新規および既存) の ID を知る必要があります。
PostgreSQLでそれを行う最速の方法はありますか? 必要に応じて DB を変更できます (デフォルト値の追加、列の追加など)。
ID のない製品 (300 万アイテム) のリストがあります - タイトルのみです。しかし、どのタイトルがすでに DB に存在するかはわかりません。新規商品(約290万点)をDBに追加する必要があります。その後、各製品 (新規および既存) の ID を知る必要があります。
PostgreSQLでそれを行う最速の方法はありますか? 必要に応じて DB を変更できます (デフォルト値の追加、列の追加など)。
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 は のserial
列tbl_id
で自動的に生成される必要がありますtbl
。
LEFT JOIN
/コンストラクトは、IS NULL
既存のタイトルを失格にします。NOT EXISTS
別の可能性でしょう。
DISTINCT
一時テーブル内の入力データの重複を防ぎますtmp
。
ANALYZE
クエリ プランナーが適切なプランを選択し、一時テーブルが自動バキュームによって分析されないようにするのに役立ちます。
300 万のアイテムがあるため、temp_buffer
(このセッションのみ)の設定を上げると費用がかかる場合があります。
SET temp_buffers = 1000MB;
または、余裕があり、一時テーブルをRAMに保持するのに十分な量で、はるかに高速です。注:セッションで最初に実行する必要があります-一時オブジェクトが作成される前に。
インポートされたデータのすべての ID を表示するには:
SELECT tbl.tbl_id, tbl.title
FROM tbl
JOIN tmp USING (title)
同じセッションで!一時テーブルは、セッションの終了時に自動的に削除されます。