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

Dumping a DB table to a flat file in C# efficiency issue

我在使用 C# 而不是 SSIS 转储平面文件时遇到效率问题。我所做的就是将大约 10 万行的数据库 table (SqlServer) 转储到文本文件中。使用 SSIS 这需要不到一秒钟,而使用下面的 C# 代码需要一分钟,这是 unacceptable。我做错了什么?:

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。此代码转储多个 table,因此 while 循环中的 Reader.Read()。查询本质上是列表

中每个table的select * from tablename

WriteLineToFile 方法:

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

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

您还没有发布从数据库读取的 C# 代码,因此我无法对此发表评论,但那里也可能存在类似的低效率问题。

因此根据 documentation 这打开和关闭文件,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);