如何更新 PostgreSQL 中的大量行?

Evg*_*zin 2 postgresql query-optimization

我需要更新表中的数千行。例如,我有 1000 行,id 为 - 1, 2.. 1000:

mytable:
| id   | value1 | value2 |
|  1   |  Null  |  Null  |
|  2   |  Null  |  Null  |
...
| 1000 |  Null  |  Null  |
Run Code Online (Sandbox Code Playgroud)

现在我需要更改前 10 行。我可以这样做:

UPDATE mytable SET value1=42, value2=111 WHERE id=1
...
UPDATE mytable SET value1=42, value2=111 WHERE id=10
Run Code Online (Sandbox Code Playgroud)

这需要很多请求,而且速度不是很快,所以我决定进行此优化:

UPDATE mytable SET value1=42  WHERE id in (1, 2, 3.. 10)
UPDATE mytable SET value2=111 WHERE id in (1, 2, 3.. 10)
Run Code Online (Sandbox Code Playgroud)

注意:在这种情况下,我实际上可以编写,SET value1=42, value2=111但在现实世界的应用程序中,这组 id 并不相同,对于一行,我需要设置 value1,对于其他行,我需要设置 value2,对于行的某些子集,我需要设置两者。因此我需要两个查询。

问题是我有大量的 id。这个查询大约有 1Mb!

Q1:这是优化此更新的正确方法吗?

Q2:发送这么大的查询是否正确?我可以通过将此查询分成几个较小的部分来获得更快的更新吗?

我无法使用where语句,我的程序中有很多行 ID。

Ric*_*ton 5

创建一个临时表并用您的目标 ID 和新值填充它。然后使用带有 FROM子句的 UPDATE 来连接到该目标并在单个命令中执行此操作。

一般来说,每当你有大量的 id/值时,如果你先将它们移入数据库,那么生活会变得更容易。