postgresql - 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
命令。
解决方案
就像@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;
请注意,当您使用参数化查询执行此操作时,参数的数量是有限的,因此您可能必须对它们进行批处理。
推荐阅读
- google-sheets - 如何使用 Arrayformula 将百分比报价设置为表中的一列
- c# - ASP.Net 如果数据不存在则添加数据,如果数据存在则更新数据
- java - 詹金斯不支持 Java 16
- c# - 想拿起工具或枪支,但想在统一 c# 中一次只选择一个
- c# - Opentap 无法将“[name].dll”复制到“bin\Debug\Dependencies\[Name].dll”。重试次数超过 10。失败
- ios - 如何在 UICollectionView 中的部分上绘制角和阴影?
- c# - 如何对涉及一些操作的键值对列表进行排序
- typescript - 调用动态函数时保持当前类上下文
- angular - 如何在 Angular 11 版本中使用 Clam AV
- java - Maven 不会使用 module-info 编译项目。有“找不到符号”和“javafx 包 XY 不存在”