> 데이터 베이스 > MySQL 튜토리얼 > SQL 쿼리가 SSMS에서는 빠르지만 ASP.NET에서는 느린 이유는 무엇입니까?

SQL 쿼리가 SSMS에서는 빠르지만 ASP.NET에서는 느린 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-12-31 21:54:14
원래의
958명이 탐색했습니다.

Why is my SQL query fast in SSMS but slow in ASP.NET?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿