在变量二进制列中按顺序写入 Blob

本文关键字:顺序 Blob 变量 二进制 | 更新日期: 2023-09-27 17:57:11

我必须将一些数据库还原到远程SQL Server。问题是它们最多可以达到几GB,这将导致一次读取所有字节时出现"内存不足"异常。在较小的数据库上,它可以正常工作。

现在,我尝试在此处按顺序将数据库流式传输到 SQL Server:

using (System.Data.SqlClient.SqlCommand command = conn.CreateCommand())
{
    command.CommandText = "INSERT INTO " + dbName + ".dbo.tempTable (blob) values (@data)";
    command.CommandTimeout = 900;
    SqlParameter dataParam = new SqlParameter("@data", SqlDbType.VarBinary);
    command.Parameters.Add(dataParam);
    SqlParameter offsetParam = new SqlParameter("@offset", SqlDbType.BigInt);
    command.Parameters.Add(offsetParam);
    SqlParameter lengthParam = new SqlParameter("@len", SqlDbType.BigInt);
    command.Parameters.Add(lengthParam);
    using (FileStream fs = new FileStream(fileSource, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        byte[] buffer = new byte[8192];
        int read = 0;
        int offset = 0;
        while ((read = fs.Read(buffer, 0, buffer.Length)) > 0)
        {
            dataParam.Value = buffer;
            offsetParam.Value = offset;
            lengthParam.Value = read;
            command.ExecuteNonQuery();
            if (offset == 0)
            {
               command.CommandText = "UPDATE " + dbName + ".dbo.tempTable SET blob.WRITE(@data, @offset, @len)";
            }
            offset += read;
         }
     }
}

现在我的问题:

一个 500mb 的数据库需要 15 分钟以上,然后停止工作,并出现以下异常:

System.Data.Common.DbException: 超时已过期。操作完成之前经过的超时期限或服务器没有响应。

提前感谢,

放松

在变量二进制列中按顺序写入 Blob

我怀疑超时是由于性能造成的。我的猜测(请注意,没有任何数据支持)是阻塞。某些内容阻止您的查询执行。阅读如何分析 SQL Server 性能,了解如何分析性能问题(如性能问题、要测量的内容、要查看的内容等)的提示。

请注意,您的UPDATE ... column.WRITE ...是可以最少记录的操作的主要候选项,请务必阅读数据加载性能指南。

作为旁注,我有一篇文章准确地描述了您的技术,包括阅读 BLOB:通过 MVC 从 SQL Server 下载和上传图像 ASP.Net。

我现在已经自己解决了。问题是我创建了一个包含 8040 字节的字节数组。这将适用于大约 50000 个请求的 520mb 数据库。我现在已将字节大小更改为 8MB。

byte[] buffer = new byte[8388608];

这现在效果很好;)