因此,我正在开展一个项目,该项目涉及在一天内将大量数据插入三个主表中。这三个表都相互链接。
以下是表格:
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
并将它们插入数据库。一个可以有 5 到 500subevents
个event
。我有一个关系表而不仅仅是一个外键列的subevents
原因是因为还有其他进程添加了subevents
没有 parent的值events
。令人困惑,也许。
到一天结束时,我可能已经插入了多达 1000 万subevents
和 250,000个events
。所以速度对我来说是最重要的事情之一。我发现将它们全部插入在一起的最佳方法之一是使用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$$;
(第一次插入只有一次,最后两次插入对每个子事件重复。我使用 C# 和 NpgSql 执行命令,并且可以在进程运行时动态构建命令。)
然而,在一天的过程中,这陷入了困境,我的数据开始备份到我无法足够快地插入它的地步。我只是想知道我是否在这里采取了错误的方法,或者是否有另一种方法可以做我已经在做的事情,但以更快的方式。