我有一个存储过程正在执行INSERT语句,我们在执行时看到显着的延迟。当从我们的C#.NET应用程序运行它以在一行中插入30条记录时,总共需要大约4秒才能完成(只计算运行SqlCommand.ExecuteNonQuery()方法所需的时间)。但是,从SQL Server Management Studio中调用相同的确切存储过程的次数只需要大约0.4秒。我无法弄清楚这两种设置之间会有10倍速度的差别。存储过程在.NET SqlCommand中比在SSMS中慢很多
我已经尝试了所有与速度无明显变化如下:
- 创建存储过程“WITH RECOMPILE”
- 检查所有正在内SSMS和C#配置的“设置”值的。唯一的区别是SET ARITHABORT,它在.NET应用程序中调用时处于SSMS状态,处于OFF状态。不过,将“SET ARITHABORT ON”添加到存储过程的开始并没有什么区别。
- 从存储过程中移除所有的默认值的参数
用于从.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
)
没有看到存储过程很难回答, 听起来,你在调用这个方法30次,但从你的代码打开和关闭,处理连接30次。保持连接打开,然后调用存储过程30次。 – Peter
也只是设置一次命令,只是为每个调用添加参数值 –
这个问题可能会帮助http://stackoverflow.com/questions/801909 – devio