SSMS와 ASP.NET 간의 SQL 성능 불일치 이해
SSMS에서 SQL 쿼리를 실행할 때 비교하면 상당한 성능 차이가 발생합니다. ASP.NET으로. 아래 표시된 쿼리는 SSMS에서는 몇 초 만에 실행되지만 웹 사이트에서는 몇 분 정도 걸립니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!