1

我有一个正在执行 INSERT 语句的存储过程,我们在执行时看到了明显的延迟。从我们的 C# .NET 应用程序运行它以连续插入 30 条记录时,总共需要大约 4 秒才能完成(仅计算运行 SqlCommand.ExecuteNonQuery() 方法所需的时间)。但是,从 SQL Server Management Studio 中调用相同的存储过程相同的次数只需要大约 0.4 秒。我无法弄清楚这两种设置之间有什么不同会产生如此不同的 10 倍速度。

我已经尝试了以下所有方法,但速度没有明显变化:

  1. 创建存储过程“WITH RECOMPILE”
  2. 检查在 SSMS 和 C# 中配置的所有“SET”值。唯一的区别是 SET ARITHABORT,它在 SSMS 中为 ON,而在从 .NET 应用程序调用时为 OFF。但是,在存储过程的开头添加“SET ARITHABORT ON”没有任何区别。
  3. 从 sproc 参数中删除了所有默认值

用于从 .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)、非默认参数列表以及将插入的新唯一标识符的输出变量设置作为表中的主键,然后是 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
) 
4

1 回答 1

2

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

另外,请确保您不是每次都打开和关闭连接。虽然连接池可能使这不是问题,但我不会让它碰运气。

于 2013-02-04T23:45:30.093 回答