中的存储过程速度慢得多.NET SqlCommand而不是SSMS
本文关键字:SqlCommand SSMS NET 存储过程 速度慢 | 更新日期: 2023-09-27 17:57:29
我有一个正在执行INSERT语句的存储过程,我们在执行该语句时看到了显著的延迟。当从我们的C#运行它时。NET应用程序在一行中插入30条记录,总共大约需要4秒才能完成(仅计算运行SqlCommand.ExecuteNonQuery()方法所需的时间)。但是,从SQLServerManagementStudio中调用相同次数的完全相同的存储过程只需要大约0.4秒。我不知道这两种设置之间有什么不同,会产生10倍的速度差异。
我尝试了以下所有操作,但速度没有明显变化:
- 正在创建存储过程"WITH RECOMPILE"
- 检查在SSMS和C#中配置的所有"SET"值。唯一的区别是SET ARITHABORT,它在SSMS中为ON,从调用时为OFF。NET应用程序。不过,在存储过程的开头添加"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)、一个非默认参数的列表,以及输出变量的设置,该变量将是作为主键插入表中的新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
)
问题可能是每个execute命令调用都会执行一个网络跃点,其中asssms将一批将所有30个命令同时发送到服务器。我相信默认情况下,SSMS会将所有30条语句作为一个批发送,但如果您更改了其他设置,也可能会影响事情。
此外,请确保每次都没有打开和关闭连接。虽然连接池可能会使这成为一个非问题,但我不会让它成为偶然。