【发布时间】:2018-07-05 14:43:48
【问题描述】:
我正在使用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类型的。
感谢您的帮助。
【问题讨论】:
-
一个重要的方面是每个插入都发生在它自己的事务中,并且为了到达 SQL Server 必须在向客户端确认之前验证它是否已写入磁盘。将这 2000 个插入包装在一个事务中,您应该会看到不同的数字。
-
三个问题:
sql是什么?您的 sql server 和应用程序之间的延迟是多少?与TSQL版本的15s相比,“长时间”是多长时间。老实说,即使在 TSQL 版本中,对于 2000 行,15 秒也是一个巨大时间 - 那台服务器是不是特别慢? -
@JeroenMostert 虽然这是 true,但它并没有真正解释两个版本之间的区别,因为 TSQL 版本也是 2000交易
-
我怀疑除了 C# 和 SSMS 之外还有一些重要的环境差异。一方面,您每次都在 C# 中编写控制台行,而不是在 SSMS 中。
-
还应该补充一下,你在SSMS中显示的查询真的不是这样做的方法。应该有一个插入,而不是 2000。它应该在一秒内运行,而不是 15 秒。
标签: c# sql-server ssms sqlcommand