아래 쿼리가 있습니다.
select databasename
from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source)
위 쿼리는 3 초 안에 완료됩니다.
위의 쿼리가 값을 반환하면 저장 프로 시저를 EXIT로 원하므로 아래처럼 다시 작성하십시오.
If Exists(
select databasename
from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source)
)
Begin
Raiserror('Source missing',16,1)
Return
End
그러나 이것은 10 분이 걸립니다.
위와 같은 쿼리를 아래와 같이 다시 작성할 수 있으며 3 초 이내에 완료됩니다.
select databasename
from somedb.dbo.bigtable l where databasename ='someval' and source <>'kt'
and not exists(select 1 from dbo.smalltable c where c.source=l.source
if @@rowcount >0
Begin
Raiserror('Source missing',16,1)
Return
End
위의 재 작성 문제는 위의 쿼리가 더 큰 저장 프로 시저의 일부이며 여러 결과 집합을 반환한다는 것입니다. C #에서는 각 결과 집합을 반복하고 일부 처리를 수행합니다.
위의 결과는 빈 결과 집합을 반환 하므로이 접근법을 사용하면 C #을 변경하고 다시 배포해야합니다.
제 질문은
왜 단지
IF EXISTS
시간이 많이 걸리도록 계획을 바꾸는가?
다음은 도움이 될 수있는 세부 정보이며 세부 정보가 필요한 경우 알려주십시오.
- 테이블과 통계 스크립트를 작성하여 광산과 동일한 계획을 얻습니다.
- 느린 실행 계획
빠른 실행 계획
Brentozar를 사용하여 느린 계획 붙여 넣기 계획 Brentozar를 사용하여 느린 계획
붙여 넣기 계획
참고 : 두 쿼리는 동일하지만 (매개 변수 사용) 유일한 차이점은 EXISTS
(익명화하는 동안 약간의 실수가 있었을 수도 있음)입니다.
테이블 생성 스크립트는 다음과 같습니다.
http://pastebin.com/CgSHeqXc- 작은 테이블 통계
http://pastebin.com/GUu9KfpS- 큰 테이블 통계