4

SQL Server Management Studio内で実行すると、(正しいインデックスを追加して最適化した後)実行に約3秒かかるクエリ(ストアドプロシージャとして保存された約1600行)があります。

このためのラッパーを C# で作成し、URI を使用してこのクエリを実行できるようにしました。ただし、これは実行に 30 秒以上かかるため、このクエリをループの一部として実行すると、保留中のリクエストが多すぎるためにブラウザが停止します。私はこのようにラッパーを書きました:

try
{
   string ConString = Constants.connString;

   using (con = new SqlConnection(ConString))
   {
      cmd = new SqlCommand(sql, con);
      con.Open();
      dr = cmd.ExecuteReader();

      while (dr.Read())
      {
         ...
      }
   }
}

私の接続文字列はこれです:

Data Source={0};Initial Catalog={1};Integrated Security=True;MultipleActiveResultSets=true

SSMS内で複数回実行したため、クエリ自体が適切であることはわかっていますが、正常に機能しました(平均5秒未満)。また、何を提供すればよいか分からないことを除いて、デバッグ情報をさらに提供できれば幸いです。

このような問題のトラブルシューティングを行うには、どこから始めればよいでしょうか?

編集:

SQL プロファイラーを実行し、いくつかの統計を収集しました。これは私が観察しているものです。実行されている正確なクエリであることは非常に奇妙です。この時点で他にできることがあれば教えてください。

ここに画像の説明を入力

4

4 に答える 4

8

Ok; 最後に、ここここで答えを見つけました。便宜上、回答をここに複製します。元のポスターであるJacques Boschに感謝します。この問題が 2004 年に解決されたなんて信じられません!

この問題は、SQL Server のParameter Sniffingが原因のようです。これを防ぐには、SP の一番上で宣言されている他の変数に受信パラメーター値を割り当てます。

それについては、この素敵な記事を参照してください

例:

CREATE PROCEDURE dbo.MyProcedure
(
    @Param1 INT
)
AS

declare @MyParam1 INT
set @MyParam1 = @Param1

SELECT * FROM dbo.MyTable WHERE ColumnName = @MyParam1 

GO

この情報はeggheadcafe.comからコピーしました。

于 2013-02-26T23:16:56.033 に答える
1

クエリ プランのキャッシュにより、SQL Server Management Studio 内でクエリがより高速に実行されることがよくあります。ベンチマークの前に、ストアド プロシージャで sp_recompile を実行してみてください。これにより、クエリ プランがクリアされます。

詳細については、http: //www.sommarskog.se/query-plan-mysteries.htmlをご覧ください。

于 2013-02-26T23:21:43.887 に答える
0

Result Set の代わりに XML を使用しないのはなぜですか? 私の知る限り、XML を使用する方が結果セットを読み取るよりもはるかに高速です。したがって、この場合、次のようなものを使用する必要があります。

SELECT * 
FROM [Table Name]
FOR XML PATH('[Your Path]'), ELEMENTS XSINIL, ROOT('Your Root')

その後、プロジェクトでシリアル化できると思います。

于 2013-02-26T20:44:47.913 に答える
0

私も一度同じ問題が発生したことがありますが、その違いはARITHABORTSQL Management Studio 経由で接続する場合の設定の違いによるものであることがわかりました。.net 接続は設定を にARITHABORT設定しOFF、SQL 管理スタジオはこの設定を に設定しONます。

SQL Management Studio で実行して同じ問題があるかどうか試してからSET ARITHABORT OFF、クエリを実行してください。

これは、この設定がこのような劇的なパフォーマンスの違いを引き起こす理由を説明するスレッドです。

于 2013-02-26T23:38:54.857 に答える