0

SQL Managerで直接正常に実行され、かなり大きな計算を実行しますが、実行に最大50〜10秒しかかからないSQL Serverストアドプロシージャがあります。

ただし、データ アダプターを介して .NET アプリからこれを呼び出すと、タイムアウトになります。ただし、タイムアウト期間が発生する前にタイムアウトが発生します。60 秒に設定しても、約 20 秒以内にタイムアウトします。

私は問題をグーグルで検索し、SPが直接機能するが、データアダプター呼び出しを介して遅いという問題に他の人が気付くのを見ました。

これを解決する方法についてのアイデアはありますか?

4

3 に答える 3

0

SSMSで直接正常に実行されると言う場合、ストアドプロシージャ自体の実行が正常に実行されることを意味しますか、それとも基盤となるSQLが正常に実行されることを意味しますか?

あなたの説明から、これはパラメータスニッフィングの例のように聞こえます。基本的に、SQL Serverは、1つのパラメーターセットには最適ですが、他のほとんどのパラメーターには非常に貧弱な実行プランをキャッシュしています。

ストアドプロシージャのクエリでRECOMPILEオプションを使用すると、実行ごとに強制的に再コンパイルできます。これが頻繁に呼び出されない場合、またはコンパイルに時間がかからない場合は、このトリックを利用できます。

もう1つの解決策は、ストアドプロシージャのパラメータをローカル変数にコピーし、それらをクエリで使用することです。例:

CREATE PROCEDURE my_proc
  @var1 INT
AS
  DECLARE @_var1 AS INT;
  SET @_var1 = @var1;

  SELECT col1, col2, col3
    FROM t1
   WHERE t1.pk = @_var1;
于 2009-05-28T13:55:55.873 に答える
0

すべてのタイムアウトを確認したことを確認してください。asp.netとwinformsのどちらを使用しているかはわかりませんが、少なくともこのリストの最初の2つが適用されます。
タイムアウト期間は経過していませんが、タイムアウトします(コードを参照)。

チェックするもう1つのことは、パラメーターが正しく設定されていることです。間違って行うと、インデックスが破損する可能性があります。私がこれを見た場所は、クエリのキーとなるvarchar列にインデックスがあり、プレーンな「AddWithValue()」または明示的に設定されていない他の関数を使用してその列のパラメータを設定する場合です。タイプ。.Netの文字列はユニコードであるため、.Netはデフォルトでnvarcharパラメータを提供します。その結果、インデックスを使用できなくなります。

于 2009-05-28T14:17:13.287 に答える
0

SqlConnection オブジェクトのタイムアウト プロパティを変更する

于 2009-05-28T16:17:00.050 に答える