ホームページ >データベース >mysql チュートリアル >SQL クエリが SSMS では速いのに、ASP.NET では遅いのはなぜですか?

SQL クエリが SSMS では速いのに、ASP.NET では遅いのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-31 21:54:14959ブラウズ

Why is my SQL query fast in SSMS but slow in 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。