안녕하세요 초보개발자 입니다.
쿼리 및 속도의 문제로 문의드립니다~!
SQL SERVER 2012를 사용하고 있습니다.
--------------------------------------------
테이블 : TABLE_PAYMENT
컬럼1 : PAYMENT_UUID (고유아이디) - PK
컬럼2 : PERSON_NUMBER (사원번호)
컬럼3 : PAY_YYYYMM (년월) - 6자리숫자
컬럼4 : PAY_AMT (급여총액)
컬럼5 : DEL_YN (삭제유무) - 'N' DEFAULT
특이사항 : 삭제되지않은 사원번호+년월 별로 급여총액은 1건
위와 같은 간단한 급여테이블인데요,
화면에서 년도로 조회를 합니다.
결과값은 해당년도의 년월 + 사원별로 해당년월의 급여와 그 사원의 최근 1년간 급여총액이 함께나와야 합니다.
(2017년 1월 급여일 경우는 2016년 2월부터 2017년 1월급여까지의 합)
(2017년 2월 급여일 경우는 2016년 3월부터 2017년 2월급여까지의 합)
예를 들면..
--------------------------------------
EX) 2017년 조회 후
2017-01 / 사원A / 100만 / 1200만 (급여가 100만으로 동일한 사람)
2017-02 / 사원A / 100만 / 1200만
.
.
.
2017-12 / 사원A / 100만 / 1200만
2017-01 / 사원B / 150만 / 1300만 (급여 변동이 심한 사람)
2017-02 / 사원B / 200만 / 1400만
.
.
.
2017-12 / 사원B / 350만 / 1650만
.
.
.
--------------------------------------
이렇게 데이터가 나와야합니다.
해서 쿼리를 짜보았습니다.
SELECT A.PAY_YYYYMM
, A.PERSON_NUMBER
, A.PAY_AMT
, SUM(B.PAY_AMT) PREV_PAY_TOT
FROM TABLE_PAYMENT A
INNER JOIN TABLE_PAYMENT B
ON A.PERSON_NUMBER=B.PERSON_NUMBER
AND B.PAY_YYYYMM BETWEEN
CONVERT(VARCHAR(6),DATEADD(MONTH,1,DATEADD(YEAR,-1,A.PAY_YYYYMM+'01')),112)
AND A.PAY_YYYYMM
AND B.DEL_YN='N'
WHERE 1=1
AND A.PAY_YYYYMM LIKE '2017' + '%'
AND A.DEL_YN='N'
, A.PERSON_NUMBER
, A.PAY_AMT
ORDER BY A.PERSON_NUMBER
, A.PAY_YYYYMM
결과는 정확하게 나오지만, 너무 느리네요..
데이터량도 많고, 쿼리도 뭔가 어색해서 늦어지는 결과인거같습니다.
CREATE INDEX INDEX_TABLE_PAYMENT_SEARCH1
ON TABLE_PAYMENT(PAY_YYYYMM, PERSON_NUMBER, DEL_YN) INCLUDE (PAY_AMT)
위와 같이 인덱스도 추가하였지만,
여전히 시간이 많이 걸립니다..
BETWEEN 부분을 개선해야하는걸까요?
무엇이 잘못된걸까요 ㅠㅠ
실행계획 없이 쿼리만 올려 주시면 어느 부분이 문제 인지 알기가 어렵네요.
만약 과도한 NL JOIN이 발생 하는 거라면,
INNER MERGE JOIN 으로 변경 해 보세요.