2017-09-06 15 views
0

SSIS 대신 C#을 사용하여 플랫 파일을 덤프 할 때 효율성 문제가 있습니다. 내가하고있는 일은 약 100k 행의 데이터베이스 테이블 (SqlServer)을 텍스트 파일로 덤핑하는 것입니다. SSIS를 사용하면 1 초 미만의 시간이 걸리고 아래의 C# 코드를 사용하면 1 분 이상 걸리고 받아 들일 수 없습니다. 어떻게 내가 잘못하고 있는가?DB 테이블을 C# 효율성 문제로 플랫 파일로 덤프

while (Reader.Read()) 
{ 
    foreach (string ColumnName in cols) 
    { 
     sb.Append('"' + Reader[ColumnName].ToString() + "\","); 
    } 

    //save lines to file 
    WriteLineToFile(TableDefinition.GetTableName(), sb.ToString()); 

    sb.Clear(); 
} 

노트 : sb 변수는 StringBuilder입니다. 이 코드는 복수 테이블을 덤프하므로 while 루프에 Reader.Read()이 루프됩니다. 쿼리는 목록에서 각 테이블에 대해 본질적으로 select * from tablename입니다

WriteLineToFile 방법

: 및 응용 프로그램 : 간단히 말해서 SSIS에서

public static void WriteLineToFile(string TableName, string Text) 
{ 
    System.IO.File.AppendAllText(OutputDir + @"\" + TableName + ".dat", Text + "\r\n"); 
} 
+2

비효율적 인 작업을 수행해야하는 경우가 있습니다. 내 생각 엔'WriteLineToFile'의 각 행에 대해 파일을 열고 닫는 것입니다. –

+0

죄송합니다. 해당 기능에 대한 코드를 포함하는 것을 잊어 버렸습니다. 원래 질문 수정. – RobPio

+0

누구나 내가 결국에 무엇에 관심이 있는지 .. 나는 SQL Server의 BCP 도구를 사용하여 끝내었다. 테이블 덤프에 대한 사용자 지정 쿼리를 지정할 수 있습니다. – RobPio

답변

1

은 대부분 대량 읽고 (SQL Server Bulk Operations를 여기에서 자세한 내용을) 수출 데이터베이스에 대한 작업을 수행 한 번에 한 라인 씩 파일에 기록하는데 이는 상당히 효율적이지 못합니다.

데이터베이스에서 읽는 C# 코드를 게시하지 않았으므로이 코드에 대해 언급 할 수는 없지만 비슷한 비 효율성이있을 수 있습니다.

0

System.IO.File.AppendAllText()에 따르면에 따라 파일이 열리고 닫힙니다. 이러한 IO 작업은 일반적으로 비교적 비쌉니다.

루프를 다시 구성하여 파일을 한 번 열고 파일에 모든 줄을 기록한 다음 파일을 닫을 수 있습니다.

var lines = new List<string>(); 
while (Reader.Read()) 
{ 

    foreach (string ColumnName in cols) 
    { 
     sb.Append('"' + Reader[ColumnName].ToString() + "\","); 
    } 
    lines.Add(sb.ToString());  

    sb.Clear(); 
} 

var path = OutputDir + @"\" + TableName + ".dat"; 

File.WriteAllLines(path, lines, Encoding.UTF8); 
+0

while 회선 외부에서 선을 선언해야합니까? – KeithL

+0

@keithl 좋은 지적 .will 편집 –