Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 此代码正在工作,但对于10k记录来说速度太慢。有没有更快的方法将数据批量插入SQL Server?_C#_Sql Server_Excel_Sqlbulkcopy - Fatal编程技术网

C# 此代码正在工作,但对于10k记录来说速度太慢。有没有更快的方法将数据批量插入SQL Server?

C# 此代码正在工作,但对于10k记录来说速度太慢。有没有更快的方法将数据批量插入SQL Server?,c#,sql-server,excel,sqlbulkcopy,C#,Sql Server,Excel,Sqlbulkcopy,此代码正在运行。它比逐行保存记录要好,但对于10K记录来说速度太慢了。有没有更快的方法将数据批量插入SQL Server 向数据库中添加批量数据 using (var scope = new TransactionScope()) { string connectionString = "Data Source=94.73.148.5;" + "Initial Catalog=YirmibesYazilimMutabakat;"

此代码正在运行。它比逐行保存记录要好,但对于10K记录来说速度太慢了。有没有更快的方法将数据批量插入SQL Server

向数据库中添加批量数据

using (var scope = new TransactionScope())
{
    string connectionString = "Data Source=94.73.148.5;" +
                              "Initial Catalog=YirmibesYazilimMutabakat;" +
                              "User id=id;Password=password;";

    var sqlConnection = new SqlConnection(connectionString);
    var sqlBulkCopy = new SqlBulkCopy(sqlConnection)
    {
        DestinationTableName = "FaturaExcel",
        BulkCopyTimeout = 6000
    };

    var dataTable = copyExcel;
    sqlConnection.Open();

    sqlBulkCopy.WriteToServer(dataTable);

    scope.Complete();
    sqlBulkCopy.Close();
    sqlConnection.Close();
    sqlConnection.Dispose();
}
编辑:添加了批量大小

bulkCopy.WriteToServer(数据表);这句话需要40秒。其他人都很好。另外我不能使用事务处理


SqlBulkCopy已经非常快了

20k记录不应花费40秒

以下是一些提高SqlBulkCopy性能的技术:

  • 使用BatchSize可以提高性能。例如4000
  • 使用SqlBulkCopyOptions.TableLock选项将提高性能
编辑:回答评论


我已经用过SqlBulkCopy了。我做错什么了吗

是的,我知道。我的观点是,您不会发现任何比SqlBulkCopy更快的插入速度

如何使用BatchSize

资料来源:

如前所述,BatchSize可能有帮助,也可能没有帮助。由于插入多个批次通常比一次插入100万行快,因此使用默认批次大小值(0=无限制)是一种不好的做法。在你的情况下,你只有2万美元,但因为需要40美元,所以值得一试

这可能与SQL数据库有关吗

我相信你的问题可能更像是网络问题或类似的问题。插入20k行的时间应少于1秒


我建议您尝试对一些“INSERT”语句进行基准测试,以检查数据库往返需要多少时间。例如,插入一行。我在Azure上见过一些人,插入一行需要超过100毫秒的时间,速度非常慢。

我发现有一种方法非常有效:尽管我怀疑BulkCopy可能是最快的方法,谢谢你的提议。根据我的经验,SqlBulkCopy和TVPs的性能也很好。不过,关注细节很重要。使用这两种技术,10K条记录不会超过几秒钟,除非您有一个超负荷的网络或超负荷的SQL Server。我有20K条记录,需要40秒。也许您是对的,这是关于超负荷的SQL Server的。因为40秒太多了。我已经用过SqlBulkCopy了。我做错什么了吗?我如何使用BatchSize?这可能是与SQL数据库相关的情况吗?BatchSize听起来很合乎逻辑。但奇怪的是,它仍然很慢。您检查过单次插入时间和数据库负载吗?var watch=System.Diagnostics.Stopwatch.StartNew();sqlBulkCopy.WriteToServer(数据表);看,停;var elapsedMs=watch.elapsedmillisons;我试过一张唱片。需要3816毫秒。你是说这个吗?
 string connectionString ="Data Source=94.73.148.5;" +
                          "Initial Catalog=YirmibesYazilimMutabakat;"               
 using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString))
 {
   var sqlConnection = new SqlConnection(connectionString);
   bulkCopy.BatchSize = 4000;
   bulkCopy.DestinationTableName = "FaturaExcel";
   var dataTable = copyExcel;
   sqlConnection.Open();
   bulkCopy.WriteToServer(dataTable);
   bulkCopy.Close();
   sqlConnection.Close();
   sqlConnection.Dispose();
 }
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString, transaction))
{
    // SET BatchSize value.
    bulkCopy.BatchSize = 4000;

    bulkCopy.DestinationTableName = "TheDestinationTable";
    bulkCopy.WriteToServer(dt);
}