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.
반응형
그리드형
'IT > MSSQL' 카테고리의 다른 글
[MSSQL] 프로시저(SP) 생성시간 및 수정시간 확인방법 (0) | 2023.08.13 |
---|---|
[MSSQL]프로파일러 쿼리 사용법 예시 (0) | 2023.04.15 |
[MSSQL] MDF, LDF 데이터 파일 물리적 위치변경 (0) | 2023.04.15 |
[MSSQL] MAXRECURSION 힌트(무한 루프 진입방지 제한) (0) | 2023.04.15 |
[MSSQL] CROSS APPLY를 통한 성능개선(부분 범위처리 TOP 5) (0) | 2023.04.15 |
댓글