쿼리 속도 저하 문제(튜닝문의) 0 2 1,920

by 전문가되자 [Oracle Tuning] 튜닝 힌트 [2016.03.30 10:50:35]


DB 고수님들 안녕하세요.

업무 중에 한가지 문의점이 발생하여 Q&A 게시판에 올리게 되었습니다.

예를 들어 3개의 테이블을 조인하여 결과를 도출하는 쿼리문이 있습니다.

원래는 1초도 안걸리던 쿼리문이 조건절을 하나 추가하면 10초이상 걸리는 현상이 발생하고

실행계획에서는 Cost나 Time의 변화는 없습니다.

추가된 조건절에 있는 컬럼은 인덱스로 지정되어 있지 않습니다.

업무 보안상 쿼리를 보여드리지 못하여 죄송합니다.

쿼리 튜닝은 초보라 이런 경우에는 어떠한 방향으로 쿼리를 튜닝해야하는지 궁금합니다.

by 마농 [2016.03.30 12:27:19]

1초도 안걸렸던 쿼리는 아마도 결과 건수가 무지 많을 듯 하고요.
결과가 많은데도 빨리 나오는 이유는 부분범위 처리 때문입니다.
전체 자료를 다 보여주는 것이 아닌 일부 자료만 우선 보여줍니다.(예 : 토드 기본값은 500건)
그리고는 사용자가 스크롤을 내리면 그때 다음 500 건을 보여줍니다.
이런식으로 전체 자료를 다 보려면 어차피 수행시간이 길 것로 예상됩니다.
데이터가 워낙 많기 때문이죠.
부분범위 처리는 최초 응답시간을 줄이려는 거구요. 전체 수행시간은 동일하다고 보면 됩니다.


원본 쿼리는 조건절이 없어 읽어낸 데이터는 곧 결과 데이터가 됩니다.
  - 전체 데이터를 쭈욱 읽으면서 운반단위인 500건을 채우면 바로 응답을 하죠.
  - 500 건을 읽고 500건을 채워 전송
그런데 조건을 준 경우에는 읽어낸 데이터 중 일부만 결과 데이터가 됩니다.
  - 500건을 읽었는데 조건을 만족하는 데이터가 100건 뿐이라면?
  - 500건을 채우기 위해 500*5=2500건을 읽어야만 응답이 가능합니다.
  - 수행시간이 5배가 걸리죠.
  - 만약 조건을 만족하는 데이터가 극히 드믈다면?(500건 미만)
  - 전체 데이터를 모두 읽고 나서야 500건을 채우지 못한 상태로 결과를 리턴합니다.
  - 부분범위 처리효가가 전혀 없는 거죠.
  - 전체 스캔량 대비 필요량 비율이 너무 적어 비효율인거죠.


실행계획의 cost 나 time 외에 계획 자체가 바뀌진 않았는지도 확인해 보시구요.
쿼리 튜닝능 비효율의 제거입니다.
비효율은 여러가지 측면에서 살펴 볼 수 있습니다.
조인 쿼리를 개선해 주세요... 라고 막연하게 질문하면 답을 드릴수가 없네요.


by 전문가되자 [2016.03.30 15:58:56]

업무하느라 지금봤네요...ㅠㅠ

LEADING HINT 절로 해결했습니다.

답변 달아주셔서 감사합니다.

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