34

SQL Server テーブルに保存されているファイル (BLOB) をハード ドライブ上のファイルにエクスポートする最も速い方法は何ですか? 2.5 TB を超えるファイル (平均 90 kb) を varbinary として保存しており、各ファイルをできるだけ早くローカル ハード ドライブに展開する必要があります。BCP は機能しているようですが、私が見ている速度では 45 日以上かかります。また、Management Studio がメモリ不足になるため、ある時点でスクリプトが失敗するのではないかと心配しています。

4

3 に答える 3

36

CLR 関数を使ってみたところ、BCP の 2 倍以上の速さでした。これが私のコードです。

元の方法:

SET @bcpCommand = 'bcp "SELECT blobcolumn FROM blobtable WHERE ID = ' + CAST(@FileID AS VARCHAR(20)) + '" queryout "' + @FileName + '" -T -c'
EXEC master..xp_cmdshell @bcpCommand

CLR メソッド:

declare @file varbinary(max) = (select blobcolumn from blobtable WHERE ID = @fileid)
declare @filepath nvarchar(4000) = N'c:\temp\' + @FileName
SELECT Master.dbo.WriteToFile(@file, @filepath, 0)

CLR 関数の C# コード

using System;
using System.Data;
using System.Data.SqlTypes;
using System.IO;
using Microsoft.SqlServer.Server;

namespace BlobExport
{
    public class Functions
    {
      [SqlFunction]
      public static SqlString WriteToFile(SqlBytes binary, SqlString path, SqlBoolean append)
      {        
        try
        {
          if (!binary.IsNull && !path.IsNull && !append.IsNull)
          {         
            var dir = Path.GetDirectoryName(path.Value);           
            if (!Directory.Exists(dir))              
              Directory.CreateDirectory(dir);            
              using (var fs = new FileStream(path.Value, append ? FileMode.Append : FileMode.OpenOrCreate))
            {
                byte[] byteArr = binary.Value;
                for (int i = 0; i < byteArr.Length; i++)
                {
                    fs.WriteByte(byteArr[i]);
                };
            }
            return "SUCCESS";
          }
          else
             "NULL INPUT";
        }
        catch (Exception ex)
        {          
          return ex.Message;
        }
      }
    }
}
于 2012-04-27T17:54:06.783 に答える