【问题标题】:Dumping a DB table to a flat file in C# efficiency issue在 C# 效率问题中将数据库表转储到平面文件
【发布时间】:2018-02-15 02:47:56
【问题描述】:

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

WriteLineToFile 方法:

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

【问题讨论】:

  • 在某些时候,您一定是在进行低效的操作。我的猜测是你打开和关闭WriteLineToFile中每一行的文件
  • 抱歉忘记包含该函数的代码。编辑原始问题。
  • 如果有人对我最终使用的内容感兴趣。我最终使用了 SQL Server 的 BCP 工具。您可以为表转储指定自定义查询

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    因此,根据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);
    

    【讨论】:

    • 行不需要在while循环之外声明吗?
    猜你喜欢
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 2013-02-08
    • 2011-01-07
    • 1970-01-01
    • 2018-02-21
    • 2023-03-18
    • 1970-01-01
    相关资源
    最近更新 更多