29

私はこの問題を数週間抱えています。問題は、クエリがWebサイトで実行されるのに4〜5分かかり、ssmsで実行されるのに最大で2〜3秒かかることです。また、customerId変数を追加するなど、このクエリに変更を加えた後、Webページですぐに実行が開始されますが、翌日には再び遅くなることがわかりました。問題のクエリは次のとおりです。

DECLARE @customerID INT
SET @customerID = @CustID
DECLARE @MyTable table(
Iden int NOT NULL IDENTITY(1,1),
ProductID int)

INSERT INTO @MyTable(ProductID)
SELECT P.ProductID FROM Product P WITH (NOLOCK)
left join Compunix_ProductMMY cpmmy with (nolock) on p.ProductID = cpmmy.ProductID
left join Compunix_CustomerMMY ccmmy with (nolock) on ccmmy.mmyid = cpmmy.mmyid
WHERE P.Deleted=0 AND P.Published=1 and (ccmmy.customerid = @customerID OR cpmmy.productid IS NULL)

SELECT c.Name, c.SeName, c.CategoryID
FROM Category c WITH (NOLOCK) 
JOIN ProductCategory PC With (NOLOCK) ON C.CategoryID = PC.CategoryID
JOIN @MyTable MT ON PC.ProductID=MT.ProductID
WHERE C.Published = 1
GROUP BY c.Name, c.SeName, c.CategoryID
ORDER BY c.Name

同じクエリを他の2つのサイトで実行していますが、これらは問題なく機能します。サイト間の唯一の違いは、それらが異なるデータベースで実行されており、遅いサイトには他の2つと比較して2倍以上の製品(54000製品)があることです。3つのサイトとそのデータベースはすべて同じマシンでホストされています。

4

7 に答える 7

31

パラメータスニッフィングの問題が発生している可能性があります。

アプリケーションでSlow、SSMSでFastを読むことをお勧めしますか?この問題を完全に理解するためのErlandSommarskogによる(長い記事ですが非常に良い)。

于 2012-04-16T13:52:36.937 に答える
12

ASP.NetアプリケーションとSSMSセッションのsys.dm_exec_sessionsを確認してください。少なくとも1つのSET設定が異なると推測するのは危険です。これはさまざまな計画に寄与する可能性があり(最終的にはこれはパラメータースニッフィングに起因します)、アプリ側は通常悪化します。

詳細については、次のその他の質問を参照してください。

Webから呼び出された場合、ストアドプロシージャは遅く、ManagementStudioからは速くなります

プロシージャはADO.NETからタイムアウトしますが、SSMSではタイムアウトしません

Webから実行するとクエリはタイムアウトしますが、SSMSから実行すると超高速になります

ADO.NETとSQLServerManagementStudioの比較-ADOのパフォーマンスが低下

于 2012-04-16T13:59:37.277 に答える
7

同じ問題が発生しました。私の場合はMARSに関連していたためMultipleActiveResultSets=True;、接続文字列から削除し、SSMSとasp.net間の実行時間はほぼ同じになりました(以前の4.5秒と比較して0.2秒)

注:MARS=複数のアクティブな結果セット。このプロパティを接続文字列に設定すると、同じ接続でインターリーブ方式で複数のクエリを実行できます。これは主に、結果セットを反復処理するときにUPDATEステートメントを送信できるようにすることを目的としています。

于 2018-08-13T14:15:15.780 に答える
2

次の手順を同時に実行することは私にとってはうまくいきました。

  1. ストアドプロシージャの再コンパイルを試してください
  2. プランキャッシュをクリアする
  3. DBの統計を更新する
于 2021-03-17T17:31:09.700 に答える
1

その価値については、非常にまれに同じ問題が発生します。年に一度かもしれません。あなたは他の答えで言及されたそれらの素晴らしいリソースのすべてを読んで消化するのに良い週を過ごすことができます、あるいはあなたは私たちがすることをすることができます。SQLServerを停止して起動します。

それは御馳走を動作します。

この問題は通常、目前の問題に直接関係していない可能性のあるさまざまなschema / sp /viewmodsの後に発生することに気づきました。

于 2013-06-25T10:44:03.257 に答える
0

ORMを使用していますか?NHibernateを使用している場合は、NHibernateでdbトレースを有効にして、何が問題になる可能性があるかを確認できます。以下は、そのようなシナリオで私が観察したシナリオの一部です。

  1. 悪い計画の選択につながる暗黙の変換(nvarcharの代わりに使用されますvarchar)。NHibernateパラメータのマッピングをログで確認できます。
  2. インデックスの欠如。

NHibernateはlog4netを使用し、ここで説明するようにアペンダーを追加する必要があります。

于 2018-08-13T22:44:41.583 に答える
0

テーブル変数と一時テーブルは、クエリの実行に大きな違いをもたらします

テーブル変数を使用している理由がわかりません。このコードを試して、速度の低下の謎が解決するかどうかを確認してください。

DECLARE @customerID INT
SET @customerID = @CustID

SELECT c.Name, c.SeName, c.CategoryID
FROM Category c WITH (NOLOCK) 
JOIN ProductCategory PC With (NOLOCK) ON C.CategoryID = PC.CategoryID
JOIN (SELECT P.ProductID FROM Product P WITH (NOLOCK)
        left join Compunix_ProductMMY cpmmy with (nolock) on p.ProductID = cpmmy.ProductID
        left join Compunix_CustomerMMY ccmmy with (nolock) on ccmmy.mmyid = cpmmy.mmyid
        WHERE P.Deleted=0 AND P.Published=1 and (ccmmy.customerid = @customerID OR cpmmy.productid IS NULL)
        ) MT ON PC.ProductID=MT.ProductID
WHERE C.Published = 1
GROUP BY c.Name, c.SeName, c.CategoryID
ORDER BY c.Name
于 2021-04-28T17:31:18.983 に答える