在C#效率问题中将DB表转储到平面文件

时间:2017-09-06 14:40:24

标签: c# sql-server database ssis flat-file

使用C#而不是SSIS转储平面文件时,我遇到了效率问题。我所做的就是将大约100k行的数据库表(SqlServer)转储到文本文件中。使用SSIS这需要不到一秒钟,使用下面的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。此代码转储多个表,因此Reader.Read()循环上的while。对于列表中的每个表,查询基本上是select * from tablename

WriteLineToFile方法:

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

2 个答案:

答案 0 :(得分:1)

简而言之,SSIS最有可能执行批量操作以进行数据库读取和导出(此处更多详细信息:SQL Server Bulk Operations),并且您的应用程序一次写入一行文件,效率明显降低。

您尚未发布从数据库中读取的C#代码,因此我无法对此发表评论,但也可能存在类似的低效率。

答案 1 :(得分:0)

所以根据documentationSystem.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);