속도개선 관련 질문 0 5 3,231

by COMAVLER [Oracle 기초] [2024.12.16 16:24:12]


안녕하세요 현재 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 건 정도됩니다.
쿼리에서 문자열을 붙이는 작업이 부하가 클까 싶어서 자바 코드 상에서 처리도 해봤고, 조건이 조금 복잡한가 해서 분리도 해봤는데 별다른 효과는 없었습니다.

혹시 제가 잘못 생각하고 있다거나 이상하게 하는 부분이 있다면 알려주세요. 감사합니다.

by 마농 [2024.12.17 08:41:57]

A 를 인덱스 스캔 하는데?
딱히 범위를 줄일만한 조건은 안보이네요?
삭제여부나 날짜조건은 거의 풀스캔 수준의 조건일 듯 합니다.
차라리 풀스캔이 나을 듯 하네요.

데이터도 몇건 안되어 보이는데요?
이 정도 데이터면 느릴 것 같지 않은데요?


by COMAVLER [2024.12.17 10:45:22]

네 맞아요 데이터도 몇 건 안되는데 왜 이럴까 싶은데..
DBeaver 에서 실행하면 쿼리 자체는 금방 실행되는데 웹서비스 상에서 오래 걸리네요.

중단점을 잡고 확인해보면 분명 해당 쿼리를 실행하고 오는데 10초 이상이 소요되거든요. 쿼리 자체의 문제가 아니라면 어떤게 문제가 될지 잘 감이 잡히지 않네요.

SQL 질문은 아니지만... 제가 지금 iBatis를 사용 중인데 혹시 저와 같은 경험을 해보신 적이 있으실까요??


by 뉴비디비 [2024.12.17 20:44:48]

결국 데이터도 작고 쿼리가 문제가 아니라 브라우저에서 화면처리 완료까지 시간이 많이 걸리는거 같은데, 원인은 여러가지가 있을꺼 같네요.

네트워크가 계속 느리거나, 서버 리소스가 부족하거나 사양이 낮아서 웹서버가 느리거나, 작업하는 PC가 느리거나, iBatis 처리 패키지가 무겁거나 등등.  ( 개인적인 추측으로는 iBatis 처리가 제일 문제일꺼 같은데 ) 

말씀하시는 중단점으로는 구분이 안될수도 있을꺼고, 네트워크 / DB / 서버 / 웹서버 / iBatis / PC 각각 분리해서 하나씩 체크해 보셔야 할꺼 같아 보이네요.


by 아발란체 [2024.12.18 15:33:28]

1. Spring JDBC로 직접 쿼리해보세요.

속도가 잘 나온다면, 오래 전에 중단된 iBatis가 아닌 myBatis로 변경해보세요

 

2. 툴에서 빠르고(부분 처리?) 웹에서 느리다면

웹단에서 다 지우고, SQL 1줄만 실행만 해보세요.

 

3. 실측 플랜을 떠보세요. SQL 세부적 단계마다 시간이 얼마나 걸리는지 볼 수 있습니다.

예측이 아닌 실측 플랜에서 짧게 걸린다면 어플단 문제로 보입니다.


by 우리집아찌 [2024.12.18 17:07:24]

ibatis 에서 바인딩 변수 처리 부분이 있으면

툴에서도 바인딩 변수 처리 해서 실행해야 할거 같아요.

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입