안녕하세요 현재 Oracle DB를 사용해서 시스템 관리를 하고 있는 개발자입니다. 특정 기능을 구현하는 쿼리에서 상당히 속도가 오래 걸려서 개선 작업을 진행하고 있는데 속도가 생각처럼 개선되지 않아서 질문 드립니다.
[현재 문제가 쿼리에서 사용하는 테이블의 정보는 다음과 같습니다]
Table A : 387 rows
- index : ORIGINOID, OID, (DELETEYN, REGISTERDATE, LASTVERSIONYN, FIXEDYN, COMMONYN)
Table B : 2293 rows
- index : (OID, DEPT), OID
[현재 개선 작업을 진행하는 쿼리는 다음과 같습니다]
SELECT A.MANAGERID || ',' || A.LEADERID || ',' || B.PL || ',' || B.WORKER AS INPUTUSER FROM A INNER JOIN B ON A.OID = B.OID WHERE A.DELETEYN = 'N' AND ((A.LASTVERSIONYN = 'Y' AND A.FIXEDYN = 'Y' AND A.COMMONYN = 'N') OR A.COMMONYN = 'Y') AND A.REGISTERDATE <= TO_DATE('2024-12-20 23:59:59', 'YYYY-MM-DD HH24:MI:SS')
실행계획 정보는 이렇게 나옵니다.
Operation | Object | Optimizer | Cost | Cardinality | Bytes |
SELECT STATEMENT | ALL_ROWS | 36 | 1,098 | 77,958 | |
HASH JOIN | 36 | 1,098 | 77,958 | ||
TABLE ACCESS (BY INDEX ROWID) |
A | ANALYZED | 18 | 148 | 5,328 |
INDEX (RANGE SCAN) |
A_INDEX | ANALYZED | 1 | 148 | 0 |
TABLE ACCESS (FULL) |
B | ANALYZED | 18 | 2,272 | 79,520 |
우선... 이렇게 조회하면 데이터는 약 1,100 건 정도됩니다.
쿼리에서 문자열을 붙이는 작업이 부하가 클까 싶어서 자바 코드 상에서 처리도 해봤고, 조건이 조금 복잡한가 해서 분리도 해봤는데 별다른 효과는 없었습니다.
혹시 제가 잘못 생각하고 있다거나 이상하게 하는 부분이 있다면 알려주세요. 감사합니다.