使用单个连接更新多行或使用带有大数组的in语句,哪个更好?

stszievb  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(241)

我有一个c#应用程序,它生成一个40k id数组,对应于postgres数据库中的记录。我需要为每个ID更新“completed”字段为“true”。我的问题是:这样做4万次是否更有效:

foreach (i in ids[]){
conn.open()
UPDATE TABLE SET "completed" = true WHERE "id" = i
conn.close()
}

或者使用一个40k项int数组:

conn.open()
UPDATE TABLE SET "completed" = true WHERE "id" IN (id[].Tostring())
conn.close()

当然,上面的代码不是正确的c#,更多的是为了说明我的问题,即对数据库进行一系列40k连接,或者使用一个连接和一个使用in语句和大数组的更新。
任何帮助都将不胜感激。

au9on6nz

au9on6nz1#

执行一个大查询可能比执行许多小查询更快。这在许多方面限制了开销,例如到服务器的网络往返、查询解析、事务管理等等。
如果你有一个非常大的值列表, in 可能不是最佳的,甚至不起作用。我建议 values() 取而代之的是:

update mytable as t
set completed = true 
from (values (1), (2), (3), ...) as v(id)  -- stuff all the values here
where t.id = v.id

相关问题