我正在使用SqlCommand将多个记录插入数据库,但是插入2000条记录需要很长时间,我做了以下代码:
using (SqlConnection sql = new SqlConnection(connectionString))
{
using (SqlCommand cmd = new SqlCommand(query, sql))
{
sql.Open();
int ff = 0;
while (ff < 2000)
{
cmd.ExecuteNonQuery();//It takes 139 milliseconds approximately
ff++;
Console.WriteLine(ff);
}
}
}
但是当我在SSMS(Sql Server Management Studio)中执行以下脚本时,2000条记录将存储在15秒内:
declare @i int;
set @i=1
while (@i)<=2000
begin
set @i=@i+1
INSERT INTO Fulls (ts,MOTOR,HMI,SET_WEIGHT) VALUES ('2018-07-04 02:56:57','0','0','0');
end
这是怎么回事? 为什么执行句子这么慢?
其他:
-该数据库是Microsoft Azure中托管的SQL数据库。
-我的互联网的加载速度为20 Mbits。
-以上查询不是真实查询,真实查询包含240列和240个值。
-我尝试按照以下示例进行交易:https://msdn.microsoft.com/en-us/library/86773566(v=vs.110).aspx
-sql变量的类型为SqlConnection。
感谢您的帮助。
答案 0 :(得分:4)
听起来您的SQL Server和应用程序服务器之间存在高延迟。当我在本地执行此操作时,纯TSQL版本的运行时间为363ms,而具有2000次往返的C#版本则需要1061ms(因此:每次往返大约为0.53ms)。注意:我将Console.WriteLine
带走了,因为我不想测量Console
的移动速度!
对于2000次插入,这是一个相当公平的比较。如果您看到与众不同的东西,那么我怀疑:
请注意,还有诸如“ DTC”之类的东西可能会影响基于连接字符串和环境事务(TransactionScope
)的性能,但是我假设这些不是这里的因素。
如果您需要在此处提高性能,则要做的第一件事就是找出为什么如此糟糕 -即原始服务器的性能糟糕 ,并且延迟为巨大。这些都不是编码问题:这些是基础架构问题。
如果您不能解决这些问题,则可以围绕它们进行编码。表值参数或批量插入(SqlBulkCopy
)都提供了传输多行的方式,而不必每次执行都往返。您还可以使用“ MARS”(多个活动结果集)和流水线插入,但这是一个很高级的主题(大多数人倾向于建议不要启用MARS)。
答案 1 :(得分:0)
确保尽量减少表上的索引数量,并按以下方式使用SqlBulkCopy
DataTable sourceData=new DataTable();
using (var sqlBulkCopy = new SqlBulkCopy(_connString))
{
sqlBulkCopy .DestinationTableName = "DestinationTableName";
sqlBulkCopy .WriteToServer(sourceData);
}