SELECT A88_ACCOUNT, A88_AMOUNT
FROM ACT_MONJIP88
WHERE A88_MONTH = '07'
MINUS SELECT A88_ACCOUNT, A88_AMOUNT
FROM ACT_MONJIP88
WHERE A88_MONTH = '07'
AND SUBSTR(A88_VOUCHER_NO,1,11)
IN (SELECT A03_VOUCHER_NO
FROM ACT_JUNPYO01 ,ACT_JUNPYO03
WHERE A01_REFERENCE_NO = A03_REFERENCE_NO
AND A01_DIVISION_NO = '3')
ACT_MONJIP88 테이블에서
전표테이블의 부서 코드가 3인 전표를 제외하하는 쿼리 입니다.
시간이 8초정도 걸리는데 이방법 저방법 써바도 더욱 느려지더군요
이방법이 가장 빠릅니다. 혹시 다른 좋은 방법이 있을까요?
저의 소견으로는
일단, 같은 TABLE을 2번 READ하는 문제인
MINUS를 사용한 것 때문에 그렇다고 보여집니다.
또한, 이런 문제를 올려주실때에는 많은 정보가 필요합니다..
왜냐하면, SQL Tunning 문제이기 때문에 그렇습니다..
먼저,
1. DBMS의 종류,
2. 각 table에서의 INDEX,
3. 각 TABLE data 건수,
4. WHERE에 의해서 걸러진 각 TABLE의 DATA 건수
(예.. a88_month='07'일때 건수)
이외, TABLE의 분할정도나, TABLESPACE등등이 있지만,
DBMS를 알지 못하는 입장에서..
1~4번까지만 먼저 제시하셨으면 좋았을 것 같군요..
먼저, 이론상으로는
SELECT A88_ACCOUNT, A88_AMOUNT
FROM ACT_MONJIP88
WHERE A88_MONTH = '07'
에서 minus를 하는게 아니고,
filter를 해야하는게 맞을 것 같습니다.
물론, 실행계획을 확인하셔서 적절히 index를 타는지 확인하시구,
index를 타지 않는다면, index를 타게끔 hint를 사용해 보시길 권고합니다.)
ps.
그리고, TABLE은 가능한 1번만 FROM에 나열되도록 해 주시는게
속도에 도움이 되실 겁니다.
[ 제안할 SQL문 ]
SELECT A88_ACCOUNT, A88_AMOUNT
FROM ACT_MONJIP88
WHERE A88_MONTH = '07'
and not exists (select 1 FROM ACT_JUNPYO01 ,ACT_JUNPYO03
WHERE A01_REFERENCE_NO = A03_REFERENCE_NO
AND A01_DIVISION_NO = '3'
and A03_VOUCHER_NO = SUBSTR(act_monjip88.A88_VOUCHER_NO,1,11)
답이 되셨길 바랍니다..