中的存储过程速度慢得多.NET SqlCommand而不是SSMS

本文关键字:SqlCommand SSMS NET 存储过程 速度慢 | 更新日期: 2023-09-27 17:57:29

我有一个正在执行INSERT语句的存储过程,我们在执行该语句时看到了显著的延迟。当从我们的C#运行它时。NET应用程序在一行中插入30条记录,总共大约需要4秒才能完成(仅计算运行SqlCommand.ExecuteNonQuery()方法所需的时间)。但是,从SQLServerManagementStudio中调用相同次数的完全相同的存储过程只需要大约0.4秒。我不知道这两种设置之间有什么不同,会产生10倍的速度差异。

我尝试了以下所有操作,但速度没有明显变化:

  1. 正在创建存储过程"WITH RECOMPILE"
  2. 检查在SSMS和C#中配置的所有"SET"值。唯一的区别是SET ARITHABORT,它在SSMS中为ON,从调用时为OFF。NET应用程序。不过,在存储过程的开头添加"SET ARITHABORT ON"并没有什么区别
  3. 已从存储过程参数中删除所有默认值

用于从调用存储过程的代码。NET应用程序是:

using (SqlConnection newConn = new SqlConnection(connectionString))
 {
   using (SqlCommand uCmd = new SqlCommand("sproc_name", newConn))
   {
      uCmd.CommandType = CommandType.StoredProcedure;
      uCmd.Connection.Open();
      //About 15 parameters added using:
      uCmd.Parameters.AddWithValue("@ParamName", value);
      ...
      //One output parameter
      SqlParameter paramOUT = new SqlParameter("@OutPutKey", SqlDbType.UniqueIdentifier);
      paramOUT.Direction = ParameterDirection.Output;
      uCmd.Parameters.Add(paramOUT);
      uCmd.ExecuteNonQuery();
      uCmd.Connection.Close();
   }
}

存储过程本身只是一个集合命令的列表(set ANSI_NULLS ON、set QUOTED_IDENTIFIER ON、set ARITHABORT ON)、一个非默认参数的列表,以及输出变量的设置,该变量将是作为主键插入表中的新uniqueidentifier,后面是INSERT语句本身。

该应用程序是基于生成的。NET 4,SQL服务器为MS SQL server 2005。

以下是它调用的插入存储过程的示例:

alter procedure InsertStuff
@Field1 uniqueidentifier,
@Field2 datetime,
...
@CreateDate datetime,
@PrimaryKEY uniqueidentifier OUTPUT
AS
declare @newCreateDate datetime 
set @newCreateDate=getDate()
set @PrimaryKEY = NEWID()
INSERT INTO [dbo].[Table]
(
    Field1,
    Field2,
    ...
    CreateDate,
    PrimaryKEY
)
VALUES
(
    @Field1,
    @Field2,
    ...
    @newCreateDate,
    @PrimaryKEY
) 

中的存储过程速度慢得多.NET SqlCommand而不是SSMS

问题可能是每个execute命令调用都会执行一个网络跃点,其中asssms将一批将所有30个命令同时发送到服务器。我相信默认情况下,SSMS会将所有30条语句作为一个批发送,但如果您更改了其他设置,也可能会影响事情。

此外,请确保每次都没有打开和关闭连接。虽然连接池可能会使这成为一个非问题,但我不会让它成为偶然。