다음과 같은 큰 테이블에 대한 쿼리가 있습니다.
declare @myIdParam int = 1
select *
from myTable
where (@myIdParam is null or myTable.Id = @myIdParam)
where 절에 이와 유사한 조건이 몇 가지 있으며 많은 조인도 있지만 이것은 요약입니다.
효과적으로 @myIdParam이 null이면이 매개 변수를 사용하여 결과를 제한하지 않습니다.
나는 DB 전문가는 아니지만 테스트 에서이 NULL 검사는 모든 레코드에 대해 수행되고 어떤 식 으로든 최적화되지 않은 것처럼 보입니다.
null 검사를 제거하고 매개 변수가 null이 아니라고 가정하면 쿼리가 즉시 반환됩니다. 그렇지 않으면 최대 10 초가 걸립니다.
런타임에 확인이 한 번만 수행되도록 이것을 최적화하는 방법이 있습니까?
@vercelli 이것은 트릭을 수행합니다. 이 질문은 실제로 선택적 매개 변수에 관한 것으로 생각하면 연결된 매개 변수와 중복됩니다.
—
Mystagogue
아마 6 년 전의 글일 것입니다. SqlServer 2014 또는 2016에는 새로운 접근 방식이있을 수 있습니다. (재 컴파일하지 않고 2014 년에 테스트했으며 영원히 걸렸습니다)
—
vercelli
실제 쿼리에는 많은 선택적 매개 변수가 있으므로 동적 SQL은 최상의 성능을 제공합니다. 주제에 대한 자세한 기사는 sommarskog.se/dyn-search.html 을 참조하십시오 .
—
Dan Guzman
질문 vercelli linked에 설명 된대로 WITH RECOMPILE을 사용하는 @DanGuzman은 쿼리 시간을 1 분 미만에서 매우 선택적 기준으로 실제로 즉각적으로 단축했습니다. 나는 이것이 성능과 가독성의 균형을 맞추기에 가장 좋은 옵션이라고 생각합니다.
—
Mystagogue
OPTION(RECOMPILE)