使用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");
}
答案 0 :(得分:1)
简而言之,SSIS最有可能执行批量操作以进行数据库读取和导出(此处更多详细信息:SQL Server Bulk Operations),并且您的应用程序一次写入一行文件,效率明显降低。
您尚未发布从数据库中读取的C#代码,因此我无法对此发表评论,但也可能存在类似的低效率。
答案 1 :(得分:0)
所以根据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);