C# 使用单个连接更新多行还是使用带有大数组的IN语句更好?
我有一个c#应用程序,它生成一个40K ID数组,对应于Postgres数据库中的记录。我需要将每个ID的“completed”字段更新为“true”。我的问题是:这样做4万次是否更有效:C# 使用单个连接更新多行还是使用带有大数组的IN语句更好?,c#,sql,database,postgresql,sql-update,C#,Sql,Database,Postgresql,Sql Update,我有一个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() UPDA
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语句和大数组的更新
任何帮助都将不胜感激。我很可能会比许多小查询更快地执行一个大查询。这在许多方面限制了开销,例如到服务器的网络往返、查询解析、事务管理等 如果您有一个非常大的值列表,中的
可能不是最优的,甚至可能不起作用。我建议改为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
执行一个大查询可能比执行许多小查询更快。这在许多方面限制了开销,例如到服务器的网络往返、查询解析、事务管理等
如果您有一个非常大的值列表,
中的可能不是最优的,甚至可能不起作用。我建议改为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
首先,您需要检查IN子句是否支持如此长的元素列表。无论如何,我更喜欢选项2,但我不会提供40K重的阵列。相反,我会将它们成批处理成2000个或更多的集合。首先,您需要检查in子句是否支持如此长的元素列表。定义“besser”。无论如何,我更喜欢选项2,但我不会提供40K重的阵列。取而代之的是,我会把它们分成2000个或更多的一组。