首页 > 解决方案 > Postgresql:单独 UPSERT 的效率(INSERT INTO ... ON CONFLICT)与组合成单个命令

问题描述

以下哪个UPSERT操作更高效(相当于执行速度更快)?或者它没有任何区别?

单独的查询:

INSERT INTO mytable (col_1, col_2) VALUES (312, 42) ON CONFLICT col_1 DO UPDATE SET col_2=excluded.col_2;
INSERT INTO mytable (col_1, col_2) VALUES (933, 32) ON CONFLICT col_1 DO UPDATE SET col_2=excluded.col_2;
...
INSERT INTO mytable (col_1, col_2) VALUES (121, 16) ON CONFLICT col_1 DO UPDATE SET col_2=excluded.col_2;

或者将相同的命令组合成一个查询:

INSERT INTO mytable (col_1, col_2) VALUES
    (312, 42) ON CONFLICT col_1 DO UPDATE SET col_2=excluded.col_2
    (933, 32) ON CONFLICT col_1 DO UPDATE SET col_2=excluded.col_2
    ...
    (121, 16) ON CONFLICT col_1 DO UPDATE SET col_2=excluded.col_2;

请记住,我说的是要完成的许多命令INSERT......在多个批次(很多)中,每个大约 750000 个INSERT命令。

标签: postgresqlsql-insertupsert

解决方案


就像@a_horse_with_no_name 在评论中所说的那样,运行单个语句通常比多个语句更有效。但是,正确的语法是

INSERT INTO mytable (col_1, col_2)
VALUES
    (312, 42),
    (933, 32),
    ...
    (121, 16)
ON CONFLICT col_1 DO UPDATE
    SET col_2 = excluded.col_2;

请注意,当您使用参数化查询执行此操作时,参数的数量是有限的,因此您可能必须对它们进行批处理。


推荐阅读