INSERT ステートメントを実行しているストアド プロシージャがあり、実行時に大幅な遅延が発生しています。これを C# .NET アプリケーションから実行して 30 レコードを連続して挿入すると、完了するまでに合計で約 4 秒かかります (SqlCommand.ExecuteNonQuery() メソッドの実行にかかった時間を数えるだけです)。ただし、SQL Server Management Studio 内からまったく同じストアド プロシージャを同じ回数呼び出すと、約 0.4 秒しかかかりません。10倍の速度の違いを生む2つのセットアップの違いがわかりません。
次のすべてを試しましたが、速度に目立った変化はありません。
- ストアド プロシージャ「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
)