복붙노트

[SQL] 수출에 가장 빠른 방법은 개별 파일에 테이블에서 물방울

SQL

수출에 가장 빠른 방법은 개별 파일에 테이블에서 물방울

하드 드라이브에있는 파일에 SQL Server 테이블에 저장 내보내기 파일 (모양) 가장 빠른 방법은 무엇입니까? 나는 파일의 이상 2.5 TB (90킬로바이트 평균) VARBINARY로 저장을하고 난 가능한 한 빨리으로 로컬 하드 드라이브에 각 하나를 추출해야합니다. BCP 작업에 보인다하지만 제가 보는 속도를 45 일 소요됩니다, 나는 관리 Studio 메모리가 부족하기 때문에 내 스크립트가 어떤 점에서 실패 할 걱정하고있다.

해결법

  1. ==============================

    1.나는 CLR 기능을 사용하여 시도하고 두 배 빠른 BCP 등의 이상이었다. 여기에 내 코드입니다.

    나는 CLR 기능을 사용하여 시도하고 두 배 빠른 BCP 등의 이상이었다. 여기에 내 코드입니다.

    원래 방법 :

    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;
            }
          }
        }
    }
    
  2. ==============================

    2.나는 최소한의 노력으로 파일에 방울을 수출을 찾고 여기에왔다. CLR 기능 내가 적어도 노력이라고 부르는 것이 아닙니다. 여기 OLE 자동화를 사용 lazier 한 바와 :

    나는 최소한의 노력으로 파일에 방울을 수출을 찾고 여기에왔다. CLR 기능 내가 적어도 노력이라고 부르는 것이 아닙니다. 여기 OLE 자동화를 사용 lazier 한 바와 :

    declare @init int
    declare @file varbinary(max) = CONVERT(varbinary(max), N'your blob here')
    declare @filepath nvarchar(4000) = N'c:\temp\you file name here.txt'
    
    EXEC sp_OACreate 'ADODB.Stream', @init OUTPUT; -- An instace created
    EXEC sp_OASetProperty @init, 'Type', 1; 
    EXEC sp_OAMethod @init, 'Open'; -- Calling a method
    EXEC sp_OAMethod @init, 'Write', NULL, @file; -- Calling a method
    EXEC sp_OAMethod @init, 'SaveToFile', NULL, @filepath, 2; -- Calling a method
    EXEC sp_OAMethod @init, 'Close'; -- Calling a method
    EXEC sp_OADestroy @init; -- Closed the resources
    

    당신은 잠재적으로 (작업이 완료되면, 그것을 해제 후와) 서버에 OA 저장 프로 시저를 실행할 수 있도록해야합니다 :

    sp_configure 'show advanced options', 1;  
    GO  
    RECONFIGURE;  
    GO  
    sp_configure 'Ole Automation Procedures', 1;  
    GO  
    RECONFIGURE;  
    GO
    
  3. from https://stackoverflow.com/questions/10325338/fastest-way-to-export-blobs-from-table-into-individual-files by cc-by-sa and MIT license