C# 大规模 SQL 更新查询

3

这是情况:

我有一个包含180万行文本的文件,需要将其注入到SQL表中。我已经有能够正常工作但速度比较慢(每天大约处理25万行)的代码。不幸的是,我还有4个同样大小的文本文件需要处理,所以我需要一种加速处理过程的方法。任何帮助都将不胜感激。如果某些代码看起来不对,那是因为我省略了一些隐私内容。我知道可以删除file.appendall,但我使用它来跟踪进度,并且我也使用star++,这样我就可以在第二天继续进行而不会停止备份。

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++;
        }

2
首先,在应用程序语言中不应该使用循环,SQL Server 有几个工具可以更高效地完成这项任务。然而,如果你正在加载数据,为什么要使用 UPDATE?难道不应该使用 INSERT 吗? - KM.
5个回答

10

7
我建议尝试使用预定的SSIS解决方案或bcp解决方案,而不是通过代码实现。此外,从您的代码中可以看出,您将其结构化以获得最小的效率。虽然对于应用程序而言它能够很好地工作,但对于批量类型操作来说绝对不是最佳选择。您的问题如下:
  • 您在每次循环迭代时都会创建只需要创建一次的数据库对象
  • 您每次都要重新连接到数据库。这也只需要在每个会话中完成一次
  • 您需要拆分此方法……但这仍然不是最好的解决方案
正如我和其他人所提到的,您确实需要制定一个特殊的批量插入解决方案。

2

我建议使用SQL Server SSIS来满足这个需求。SSIS有包变量可实现动态替换值。


2

首先,在循环之外只打开一次连接。此外,调用 cmd.ExecuteNonQuery() 而不是创建一个你将要丢弃的读取器。你可能还考虑在打开连接后创建你的 SqlCommand 并仅重新分配 SQL 语句到 .CommandText 属性。如果这样做,也将其设置为准备好的语句并仅将值分配给参数。


0
以上全部都是。然而,一些简单的加速方法包括使用字符串构建器代替字符串连接,并保持数据库连接开放,这些方法应该能够节省大量时间。

string.Join的性能优于StringBuilder,除非他想花时间计算构建字符串的大小。(公平地说,string.Join会使用一个StringBuilder,但进行了优化) - marr75

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接