在varbinary列中按顺序写入blob

时间:2014-04-07 12:26:11

标签: c# sql sql-server sequential varbinary

我必须将一些数据库还原到远程SQL Server。问题是它们可能达到几gb,这会在一次读取所有字节时导致“OutOfMemory”异常。在较小的数据库上,它可以正常工作..

现在我尝试在此处按顺序将数据库流式传输到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:超时已过期。操作完成之前经过的超时时间或服务器没有响应。

提前致谢,

放松

2 个答案:

答案 0 :(得分:0)

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

请注意,UPDATE ... column.WRITE ...Operations That Can Be Minimally Logged的主要候选人,请务必阅读The Data Loading Performance Guide

作为旁注,我有一篇文章描述了你的技术,包括阅读BLOB:Download and Upload images from SQL Server via ASP.Net MVC

答案 1 :(得分:0)

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

byte[] buffer = new byte[8388608];

现在效果很好;)