1

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

次のすべてを試しましたが、速度に目立った変化はありません。

  1. ストアド プロシージャ「WITH RECOMPILE」の作成
  2. SSMS および C# 内で構成されているすべての「SET」値を確認します。唯一の違いは SET ARITHABORT で、これは SSMS では ON で、.NET アプリケーションから呼び出されたときには OFF でした。ただし、ストアド プロシージャの先頭に「SET ARITHABORT ON」を追加しても違いはありませんでした。
  3. 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
) 
4

1 に答える 1

2

おそらく問題は、すべてのexecuteコマンド呼び出しがネットワークホップを実行することです。ssmsは30個のコマンドすべてを一度にバッチでサーバーに送信します。デフォルトでは、SSMSは30個のステートメントすべてを単一のバッチとして送信すると思いますが、他の設定を変更した場合は、同様に影響を与える可能性があります。

また、毎回接続を開いたり閉じたりしないように注意してください。接続プールはそれを問題にしないかもしれませんが、私はそれを偶然に任せません。

于 2013-02-04T23:45:30.093 に答える