有效地迭代和更新数据库中的大量数据

时间:2018-08-11 23:51:39

标签: c# sql-server asynchronous dapper

我在SQL Server中有一个表,该表以二进制格式存储文件。每行平均约3MB,并且有数万行。我想做的事情(因为我必须保留这些表),是查询每一行,然后对二进制数据进行一些压缩,然后重新插入数据(通过更新每一行)。

我目前的幼稚实现只是做类似的事情(使用Dapper):

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", { ... });
}

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

任何建议(使用SQL Server BTW)将不胜感激。

1 个答案:

答案 0 :(得分:1)

可以使用内置函数COMPRESS在数据库实例上执行整个操作,而无需通过网络将数据移至应用程序和返回:

  

此函数使用GZIP算法压缩输入表达式。该函数返回一个类型为varbinary(max)的字节数组。

UPDATE Files 
SET Content = COMPRESS(Content)
WHERE ID IN (range); -- for example 1k rows per batch

如果您使用的SQL Server版本低于2016,或者需要“自定义”压缩算法,则可以使用user-defined CLR function