C# 此代码正在工作,但对于10k记录来说速度太慢。有没有更快的方法将数据批量插入SQL Server?
此代码正在运行。它比逐行保存记录要好,但对于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;"
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);
}