2011-10-05 1 views
4

저장 프로 시저 내부에서 "IF"조건을 구현하는 가장 좋은 방법은 무엇인지 알고 싶습니다.쿼리 계획 재사용을 향상시키는 조건 인 경우 T-SQL의 기본 메서드

나는이 방법이 광범위하게 사용되는 것을 보았다. 나는 세트 기반 방법을 사용하는 것을 선호하는 반복적 인 코딩에 필적 ...

declare @boolExpression bit = 1 --True 

if @boolExpression = 1 
    select column from MyTable where group = 10 
else 
    select column from MyTable where group = 20 

... 나는 그것을 이해하기 때문에이 방법을 사용하는 것을 선호

declare @boolExpression bit = 1 --True 

select column from MyTable where group = 10 and @boolExpression =1 
union all 
select column from MYTable where group = 20 and @boolExpression =0 

는 재 사용 가능한을 만듭니다 쿼리 계획 및 적은 계획 캐시 변동. 사실인가 허구인가? 어떤 것이 올바른 사용법입니다. 사전

+1

두 번째 UNION ALL이 누락 되었습니까? –

+0

네, 감사합니다 Martin, UNION ALL이 누락되었습니다. 나는 –

답변

4

당신이 UNION ALL 누락 가정에서

덕분에 지금까지 내가 볼 수있는 것이 훨씬 없습니다. 첫 번째 버전은 COND 연산자의 자식으로 각 명령문에 대한 계획을 캐시에 저장하므로 실행시 해당 명령 만 호출됩니다.

Plan 1 screenshot

두 번째는 연결 연산자의 자식으로 두 가지를해야합니다. 필터에는 Startup Expression Predicate가 있습니다. 이는 필요한 경우 각 검색 만 평가된다는 의미입니다. 다음과 같이

Plan 2 screenshot

+0

에 그것을 추가 할 것입니다. bit 매개 변수가 1 또는 0 값을 가지므로 왜 select 문 중 하나가 항상 0 행을 반환 할 때 조합이 왜 필요합니까? –

+1

@Adrian - 결과 집합은 하나만 반환됩니다. 2 개의 결과 세트를 리턴하는 대신 하나는 비어 있고 하나는 데이터를 포함합니다. –

+0

ok, 처음 엔이 트릭을 볼 때 –

0

또한 그것을 사용할 수 있습니다

DECLARE @boolExpression BIT = 1 

SELECT column FROM MyTable 
WHERE 
    CASE 
     WHEN @boolExpression = 1 THEN 
      CASE 
       WHEN group = 10 THEN 1 
       ELSE 0 
      END 
     ELSE 
      CASE 
       WHEN group = 20 THEN 1 
       ELSE 0 
      END 
    END = 1 

을 내가 저장 프로 시저의 매개 변수입니다 적용 할 때 특히에-경우, 복잡하게 보이지만 트릭을한다는 것을 알고 선택 과목.

+0

이것은 부인할 수 없으며 검색을 시도하지 않습니다. –

+0

@ Martin Smith : 귀하의 의견에 진심으로 감사드립니다. 스캔 한 것으로 알고 있습니다. WHERE 절에서 조건부 연산을위한 다른 방법을 묘사하고 싶습니다. 성능이 실제 관심사가 될 때까지 변경 사항을 유지하기가 더 쉽기 때문에 실제 관심사/요구 사항에 따라 변경 될 수 있습니다. 그것은 그 질문에서 정말로 분명하지 않았습니다. –

+0

내 눈이 물을주고 있습니다. –