我有一個存儲過程正在執行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