Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用单个连接更新多行还是使用带有大数组的IN语句更好?_C#_Sql_Database_Postgresql_Sql Update - Fatal编程技术网

C# 使用单个连接更新多行还是使用带有大数组的IN语句更好?

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

我有一个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语句和大数组的更新


任何帮助都将不胜感激。

我很可能会比许多小查询更快地执行一个大查询。这在许多方面限制了开销,例如到服务器的网络往返、查询解析、事务管理等

如果您有一个非常大的值列表,中的
可能不是最优的,甚至可能不起作用。我建议改为
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个或更多的一组。