そのため、私は 1 日の間に膨大な量のデータを 3 つのメイン テーブルに挿入するプロジェクトに取り組んでいます。3 つのテーブルはすべて相互にリンクされています。
ここにテーブルがあります:
event
user_id
event_time
event_id (PRIMARY) (Serial Int)
subevent
subevent_type
subevent_value
subevent_id (PRIMARY) (Serial Int)
event_relationship
event_id (1)
subevent_id (MANY)
events
いつでも発生する可能性があり、発生した場合は、詳細を記録subevents
してデータベースに挿入する必要があります。subevents
1 つの に5 ~ 500 の範囲が存在する可能性がありますevent
。外部キー列だけでなく関係テーブルがある理由は、親を持たないsubevents
値を追加する他のプロセスがあるためです。混乱するかもしれません。subevents
events
1 日の終わりまでに、おそらく 1000 万subevents
と 250,000を挿入したことでしょうevents
。そのため、スピードは私にとって最も重要なことの 1 つです。それらをまとめて挿入するために私が見つけた最良の方法の 1 つは、DO $$ DECLARE ... END$$;
コマンドを使用することです。一時整数値を宣言し、挿入する と の ID をキャプチャして、events
それらを一緒にテーブルsubevents
に挿入できます。event_relationship
これが私が現在実行しているコードで、PL/pgSqlとして実行されます
DO $$ DECLARE _new_event_id INTEGER; _new_subevent_id INTEGER;
BEGIN
INSERT INTO event (user_id, event_time) VALUES (@user_id, @event_time)
RETURNING event_id INTO _new_event_id;
INSERT INTO subevent (subevent_type, subevent_value)
VALUES (@subevent_type, @subevent_value)
RETURNING subevent_id INTO _new_subevent_id;
INSERT INTO event_relationship VALUES (_new_event_id, _new_subevent_id);
END$$;
(最初の挿入は 1 回だけで、最後の 2 つの挿入はサブイベントごとに繰り返されます。C# と NpgSql を使用してコマンドを実行し、プロセスの実行時にコマンドを動的に構築できます。)
しかし、1 日が経つにつれて、これは行き詰まり、私のデータは十分な速さですべてを挿入できないところまでバックアップし始めます。ここで間違ったアプローチをとっているのか、それとも、すでに行っていることをより高速に行う別の方法があるのか 疑問に思っています。