无处不在的情景:
我有一个180万行文本文件,我需要注入一个SQL表,我的代码工作正常,只是有点慢(如每天250k行)。不幸的是,我有大约4个这样大小的文本文件,所以我需要一种方法来加快这个过程。任何帮助,将不胜感激。如果某些代码看起来不正确,那么我会省略一些隐私的东西。我知道我可以砍掉file.appendall,但我用它来跟踪它,我也做了明星++,所以我可以在第二天拿起来不停止备份。
DirectoryInfo dinfo = new DirectoryInfo(ocrdirectory);
FileInfo[] Files = dinfo.GetFiles("*.txt");
foreach (FileInfo filex in Files)
{
string[] primaryfix = File.ReadAllLines(dinfo + "\\" + filex);
string filename = filex.ToString();
string[] spltifilename = filename.Split('.');
foreach (string primary in primaryfix)
{
string sqltable = ("dbo.amu_Textloadingarea");
string sql = "update " + sqltable +
" set [Text] = [Text] + '" + primary +"|"+
"' where unique = '" + spltifilename[0] + "'";
File.AppendAllText(@"C:\convert\sqltest.txt", sql+"\n");
SqlConnection con = new SqlConnection("Data Source= Cote ;Initial Catalog= eCASE;Integrated Security= SSPI");
con.Open();
SqlCommand cmd = new SqlCommand(sql, con);
SqlDataReader reader = cmd.ExecuteReader();
con.Close();
Console.WriteLine(start);
start++;
}
答案 0 :(得分:10)
您需要查看 BULKCOPY 。特别是,请查看SqlBulkCopy
类。
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx
http://msdn.microsoft.com/en-us/library/7ek5da1a%28VS.80%29.aspx
使用SqlBulkCopy将大型文本文件(+ 1M行)加载到数据库的好文章
http://blog.stevienova.com/2008/01/16/net-fastest-way-to-load-text-file-to-sql-sqlbulkcopy/
答案 1 :(得分:7)
我建议您尝试使用预定的SSIS解决方案或bcp解决方案,而不是通过代码。
此外,通过查看您的代码,您已经构建了最低效率的代码。虽然你所拥有的将适用于应用程序,但它绝对不适合批量操作。你的问题:
正如我和其他人所提到的,你真的需要制定一个特殊的批量插入解决方案。
答案 2 :(得分:2)
我会尝试使用SQL Server SSIS来满足这样的要求。 SSIS具有允许动态替换值的包变量。
答案 3 :(得分:2)
对于初学者,只打开一次连接(在循环外)。此外,请致电cmd.ExecuteNonQuery()
,而不是创建一个你只是要扔掉的读者。您也可以考虑创建SqlCommand
一次(打开连接后)并将SQL语句重新分配给.CommandText
属性。如果你这样做,也要把它作为预备语句,并将值分配给参数。
答案 4 :(得分:0)
以上所有。然而,一些简单的加速将是使用字符串生成器而不是字符串连接,并保持数据库连接打开,这些应该节省您很多时间。