我在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)将不胜感激。
答案 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。