我有一个正在执行 INSERT 语句的存储过程,我们在执行时看到了明显的延迟。从我们的 C# .NET 应用程序运行它以连续插入 30 条记录时,总共需要大约 4 秒才能完成(仅计算运行 SqlCommand.ExecuteNonQuery() 方法所需的时间)。但是,从 SQL Server Management Studio 中调用相同的存储过程相同的次数只需要大约 0.4 秒。我无法弄清楚这两种设置之间有什么不同会产生如此不同的 10 倍速度。
我已经尝试了以下所有方法,但速度没有明显变化:
- 创建存储过程“WITH RECOMPILE”
- 检查在 SSMS 和 C# 中配置的所有“SET”值。唯一的区别是 SET ARITHABORT,它在 SSMS 中为 ON,而在从 .NET 应用程序调用时为 OFF。但是,在存储过程的开头添加“SET ARITHABORT ON”没有任何区别。
- 从 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
)