본문 바로가기
IT/MSSQL

[MSSQL]실행계획을 2가지 방식으로 가져가게 하기위한 방법/분기처리

by 베베야 2023. 4. 15.
728x90

입력되는 값에 따라 실행계획을 2가지 방식으로 가져가게 하기위한 방법을 설명한다.

예를들면 사원번호를  입력하지 않아도 되는 상황등이 있다.

 

사전 구성 스크립트

use INDEX_TEST

go



--drop table TB_OR

SELECT ROW_NUMBER() OVER (ORDER BY a.number) AS userid

, NEWID() AS txt

, DATEADD(dd,a.number,'2020-01-01') AS date

INTO TB_OR

FROM master..spt_values a, master..spt_values b

WHERE a.type = 'P'

AND b.type = 'P'

AND a.number BETWEEN 1 AND 1000

AND b.number BETWEEN 1 AND 1000



CREATE INDEX NIDX01_OR on TB_OR (userid)

GO

UNION ALL 분기처리

Create proc usp_2

 @userid int

as

SELECT SUM(cnt) cnt

FROM (SELECT COUNT(*) cnt

 FROM TB_OR

 WHERE ( @userid IS NULL)

 UNION ALL

 SELECT COUNT(*) cnt

 FROM TB_OR

 WHERE ( @userid IS NOT NULL AND userid = @userid)

) a

GO
exec usp_2 null

exec usp_2 555

(1개 행 적용됨)

테이블 'Worktable'. 스캔 수 0, 논리적 읽기 0, 실제 읽기 0, 페이지 서버 읽기 0, 미리 읽기 읽기 0, 페이지 서버 미리 읽기 읽기 0, lob 논리적 읽기 0, lob 실제 읽기 0, lob 페이지 서버 읽기 0, lob 미리 읽기 읽기 0, lob 페이지 서버 미리 읽기 읽기 0.

테이블 'TB_OR'. 스캔 수 1, 논리적 읽기 2739, 실제 읽기 0, 페이지 서버 읽기 0, 미리 읽기 읽기 0, 페이지 서버 미리 읽기 읽기 0, lob 논리적 읽기 0, lob 실제 읽기 0, lob 페이지 서버 읽기 0, lob 미리 읽기 읽기 0, lob 페이지 서버 미리 읽기 읽기 0.



(1개 행 적용됨)

테이블 'TB_OR'. 스캔 수 1, 논리적 읽기 3, 실제 읽기 0, 페이지 서버 읽기 0, 미리 읽기 읽기 0, 페이지 서버 미리 읽기 읽기 0, lob 논리적 읽기 0, lob 실제 읽기 0, lob 페이지 서버 읽기 0, lob 미리 읽기 읽기 0, lob 페이지 서버 미리 읽기 읽기 0.

테이블 'Worktable'. 스캔 수 0, 논리적 읽기 0, 실제 읽기 0, 페이지 서버 읽기 0, 미리 읽기 읽기 0, 페이지 서버 미리 읽기 읽기 0, lob 논리적 읽기 0, lob 실제 읽기 0, lob 페이지 서버 읽기 0, lob 미리 읽기 읽기 0, lob 페이지 서버 미리 읽기 읽기 0.


IF 분기처리

IF 분기할 경우 실행계획이 2개가 생김

Create proc usp_3

 @userid int

as

if @userid is NULL

(

SELECT SUM(cnt) cnt

FROM (SELECT COUNT(*) cnt

 FROM TB_OR

 WHERE ( @userid IS NULL)

) a

)

else if @userid IS NOT NULL

(

SELECT SUM(cnt) cnt

FROM( SELECT COUNT(*) cnt

 FROM TB_OR

 WHERE ( @userid IS NOT NULL AND userid = @userid)

) b

)

GO

exec usp_3 null

exec usp_3 555

GO

(1개 행 적용됨)
테이블 'TB_OR'. 스캔 수 1, 논리적 읽기 2739, 실제 읽기 1, 페이지 서버 읽기 0, 미리 읽기 읽기 1777, 페이지 서버 미리 읽기 읽기 0, lob 논리적 읽기 0, lob 실제 읽기 0, lob 페이지 서버 읽기 0, lob 미리 읽기 읽기 0, lob 페이지 서버 미리 읽기 읽기 0.


(1개 행 적용됨)
테이블 'TB_OR'. 스캔 수 1, 논리적 읽기 3, 실제 읽기 0, 페이지 서버 읽기 0, 미리 읽기 읽기 0, 페이지 서버 미리 읽기 읽기 0, lob 논리적 읽기 0, lob 실제 읽기 0, lob 페이지 서버 읽기 0, lob 미리 읽기 읽기 0, lob 페이지 서버 미리 읽기 읽기 0.

 

참고 : http://datawisen.blogspot.com/2018/01/union-all.html

반응형
그리드형

댓글