为什么使用SqlCommand插入语句很慢?

时间:2018-07-05 14:43:49

标签: c# sql-server ssms sqlcommand

我正在使用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。

感谢您的帮助。

2 个答案:

答案 0 :(得分:4)

听起来您的SQL Server和应用程序服务器之间存在高延迟。当我在本地执行此操作时,纯TSQL版本的运行时间为363ms,而具有2000次往返的C#版本则需要1061ms(因此:每次往返大约为0.53ms)。注意:我将Console.WriteLine带走了,因为我不想测量Console的移动速度!

对于2000次插入,这是一个相当公平的比较。如果您看到与众不同的东西,那么我怀疑:

  • 您的SQL Server的电源严重不足-在任何情况下(我的363ms定时开启),不要花15s(从问题中)插入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);
}