CREATE PROC ITEM_SELECT
(
@ITEM_CD NVARCHAR(20) = NULL,
@ITEM_NM NVARCHAR(30) = NULL,
@ITEM_SPEC NVARCHAR(50) = NULL,
@ITEM_TYPE NVARCHAR(20) = NULL,
@EMP_NM NVARCHAR(20) = NULL
)
AS
BEGIN
SELECT ITEM_SYS,
ITEM_CD,
ITEM_NM,
ITEM_SPEC
FROM ITEM A
LEFT JOIN TYPE B ON A.ITEM_TYPE = B.SUB_CD AND B.TYPE_CD = 'CM001'
LEFT JOIN EMP C ON A.EMP_ID = C.EMP_ID
WHERE (@ITEM_CD IS NULL OR (@ITEM_CD IS NOT NULL AND ITEM_CD = @ITEM_CD))
AND (@ITEM_NM IS NULL OR (@ITEM_NM IS NOT NULL AND ITEM_NM LIKE @ITEM_NM + '%'))
AND (@ITEM_SPEC IS NULL OR (@ITEM_SPEC IS NOT NULL AND ITEM_SPEC LIKE @ITEM_SPEC + '%'))
AND (@ITEM_TYPE IS NULL OR (@ITEM_TYPE IS NOT NULL AND B.SUB_NM = @ITEM_TYPE))
AND (@EMP_NM IS NULL OR (@EMP_NM IS NOT NULL AND C.EMP_NM = @EMP_NM))
ORDER BY ITEM_CD;
END
쿼리를 프로시져로 만들때 조인하여 조건검색을 아래처럼 작성하고 있습니다
그런데
1. (@ITEM_CD IS NULL OR (@ITEM_CD IS NOT NULL AND ITEM_CD = @ITEM_CD))
2. ITEM_CD = @ITEM_CD
1번처럼 작성할 경우 2번처럼 작성할때보다 속도가 나오지 않는 문제가 있습니다
기타 CASE 문 처리도 동일합니다
@ITEM_CD IS NULL, @ITEM_CD IS NOT NULL 등의 조건 처리가 원인인거 같은데요
동적쿼리로 작성하자니 쿼리 확인의 어려움 있어서 될수 있으면 정적쿼리로 작성하려고 합니다
찾아보니 동적쿼리로 작성해야 인덱스를 타는거 같은데 방법이 없을까요?
고수님들의 의견 부탁드립니다
감사합니다.
동적쿼리 디버깅이 걱정이신 듯 한데요.
@sql = 'select * from table'
select @sql
--exec(@sql)
이렇게 실행 전에 출력해 보시고 결과를 다시 쿼리창에 붙여 실행해 보시면서 디버깅 하면 됩니다.
동적쿼리 외에 index를 타게하는 방법은 없을 듯 합니다.