Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.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# 高效地迭代和更新数据库中的大量数据_C#_Sql Server_Asynchronous_Dapper - Fatal编程技术网

C# 高效地迭代和更新数据库中的大量数据

C# 高效地迭代和更新数据库中的大量数据,c#,sql-server,asynchronous,dapper,C#,Sql Server,Asynchronous,Dapper,我在SQLServer中有一个表,它以二进制格式存储文件。每行平均为~3MB,有上万行。因为我必须保留这些表,所以我想做的是查询每一行,然后对二进制数据运行一些压缩,然后通过更新每一行来重新插入数据 我当前的naive实现只是使用以下方法执行类似的操作: 显然,这是非常低效的,因为它首先将所有文件加载到内存中,等等。。。我希望能够以某种方式批量执行查询/更新,理想情况下,如果可能的话,我希望能够异步运行每个批 如果您有任何建议,请使用SQL Server顺便提一下。整个操作可以在db实例上完成,

我在SQLServer中有一个表,它以二进制格式存储文件。每行平均为~3MB,有上万行。因为我必须保留这些表,所以我想做的是查询每一行,然后对二进制数据运行一些压缩,然后通过更新每一行来重新插入数据

我当前的naive实现只是使用以下方法执行类似的操作:

显然,这是非常低效的,因为它首先将所有文件加载到内存中,等等。。。我希望能够以某种方式批量执行查询/更新,理想情况下,如果可能的话,我希望能够异步运行每个批


如果您有任何建议,请使用SQL Server顺便提一下。

整个操作可以在db实例上完成,而无需通过网络将数据移动到应用程序和应用程序之间,使用内置功能:

此函数使用GZIP算法压缩输入表达式。函数返回varbinarymax类型的字节数组


如果您使用的SQL Server版本低于2016,或者您需要自定义压缩算法,则可以使用。

请参阅SQL命令行工具:我知道这些工具,但我不确定它们在这种情况下有何帮助。在更新行之前,我需要使用C来处理数据。使用实用程序传输机制更快。因此,您可以将main函数设置为bat文件,将数据发送到c标准输入,然后获取标准输出。但通过这种方式,您将所有文件发送到DB-这比将它们一起加载到内存更糟糕@ChayimFriedman一切都是在DB实例上完成的。没有数据通过网络传输到应用程序。\@Chayim Friedman:不知道你的意思是什么?根据问题的文件已在数据库中。。。。!是的,我确实需要使用自定义压缩算法。你能详细说明你所说的“用户定义的CLR函数”是什么意思吗?我以前没见过这个词。我在这里找到了关于这个主题的信息:你可能想在你的答案中包含这些信息。我认为这可能是最好的方法,我会认为你的答案是正确的,除非有人在第二天内给出更好的选择。谢谢
var files = con.QueryAsync<MyClass>("SELECT ID, Content from Files");

foreach (var file in files)
{
    ... compress file.Content here
    con.ExecuteAsync("UPDATE Files SET Content = @NewContent WHERE ID = @ID", { ... });
}
UPDATE Files 
SET Content = COMPRESS(Content)
WHERE ID IN (range); -- for example 1k rows per batch