ホームページ >データベース >mysql チュートリアル >SQL クエリが SSMS では速いのに、ASP.NET では遅いのはなぜですか?
SSMS と ASP.NET の間の SQL パフォーマンスの相違について
SSMS と ASP.NET を比較すると、SQL クエリを実行するとパフォーマンスに大きな違いが生じます。 ASP.NETへ。以下に示すクエリは、SSMS では数秒で実行されますが、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
犯人: パラメーター スニッフィング
この不一致の原因として最も考えられるのは、パラメータ スニッフィングです。パラメーター スニッフィングは、SQL Server が初回実行時にクエリ パラメーターを分析し、それらのパラメーターに基づいて実行プランを作成するパフォーマンス最適化手法です。後でクエリ パラメーターが変更された場合、SQL Server は実行プランを再コンパイルせず、元のプランを引き続き使用する可能性があります。これは、新しいパラメーターにとって最適ではない可能性があります。
この場合、クエリのパフォーマンスが低下する可能性があります。 @CustID の特定の値を使用して初めてクエリを実行したときに最適化された実行プランは、異なる @CustID 値を使用した後続の実行には理想的ではありません。
問題
パラメータ スニッフィングを軽減するには、クエリで FORCESEEK ヒントを使用します。これにより、SQL Server はクエリの実行ごとに新しい実行プランを作成し、指定されたパラメータに対して最適なプランが使用されるようになります。
この問題を解決するには、クエリを次のように変更します。
DECLARE @customerID INT SET @customerID = @CustID DECLARE @MyTable table( Iden int NOT NULL IDENTITY(1,1), ProductID int) WITH (FORCESEEK) 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
以上がSQL クエリが SSMS では速いのに、ASP.NET では遅いのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。