SQL 목록 조회가 오래 걸릴 때?

Joy·2023년 7월 28일
0

에러인생

목록 보기
12/15

며칠 전 한 게시판의 목록을 불러오는데 조회가 안 되는 일이 있었다.
정확히는 기본 리스트는 시간이 좀 걸려도 떴지만, 검색을 했을 때 조회가 어어어엄청 오래 걸리는 일이었다.

게시판의 데이터 양이 워낙 많기도 했지만 그 전에는 분 단위로 넘어가진 않았는데, 이번엔 분을 넘겨버린 것이다...
뭔가 있다고 생각해서 원인을 분석해봤다.

원인을 찾기 위해 두 가지를 살펴보았다.

  1. 목록을 불러올 때 앞 단에 걸린 조건이 문제일까?
  2. SQL 실행할 때 테이블을 JOIN 할 때 문제가 생긴걸까?

검색 문제는 2번이 원인일 가능성이 컸지만, 우선 1번 부터!

우선, jsp에서 목록을 불러올 때 셀렉트 박스 조건이 있었다.

'전체, 1유형, 2유형' 3가지가 있다고 했을 때,
'전체'를 기본으로 목록을 불러오기 때문에 데이터 전체를 불러올 수밖에 없다. 데이터 양은 많으니 당연히 오래 걸릴 수 밖에 없었고,,,

그래서 '전체' 유형을 숨기고 '1유형'을 기본으로 해서 목록을 불러오게끔 바꿔보았다.

결과는?
전체 목록을 불러오는 속도는 조금 향상되었지만 검색을 했을 때 여전히 굉장히 많은 시간이 소요가 됐다.

그럼 2번을 봐야겠지?

쿼리는 대충

SELECT
    A.COLUMN1
    , A.COLUMN2
    , B.COLUMN1
    , C.COLUMN1
    , D.COLUMN1
    , CASE
        WHEN E.COLUMN1 IS NOT NULL AND E.COLUMN1 != ''
        THEN SUBSTR(E.COLUMN1, '1', '3')
        ELSE SUBSTR(B.COLUMN1, '1', '3')
    END AS EXAMPLE
FROM EXTABLE A
    LEFT JOIN EXTABLE B ON A.COLUMN1 = B.COLUMN1
    LEFT JOIN EXTABLE C ON B.COLUMN1 = C.COLUMN1
    LEFT JOIN EXTABLE D ON C.COLUMN1 = D.COLUMN1
    LEFT JOIN EXTABLE E ON B.COLUMN1 = E.COLUMN1
WHERE ...
;

이렇게 생겼다.

문제는 여기서 B테이블과 E테이블의 데이터 수가 엄청 많았다는 것!
근데 저 CASE문에서 B와 E테이블의 컬럼을 하나하나 비교하다보니... 시간이 그렇게 오래 걸렸던 것이다.

결국 수정을 하였고

SELECT
    A.COLUMN1
    , A.COLUMN2
    , B.COLUMN1
    , C.COLUMN1
    , D.COLUMN1
    SUBSTR(B.COLUMN1, '1', '3') AS EXAMPLE
FROM EXTABLE A
    LEFT JOIN EXTABLE B ON A.COLUMN1 = B.COLUMN1
    LEFT JOIN EXTABLE C ON B.COLUMN1 = C.COLUMN1
    LEFT JOIN EXTABLE D ON C.COLUMN1 = D.COLUMN1
WHERE ...
;

E테이블의 조인을 풀어버렸다. 하하.

어차피 필요한 정보는 E테이블 없이도 다 뽑을 수 있었기 때문에!

암튼 조인을 하나 풀었더니 검색도 잘 작동하고 리스트도 잘 나오고ㅎㅎ
나 혼자 해결한 것은 아니고 선임님과 같이 해결하였지만 그래도 한건 한 느낌이라 기분 좋았다ㅋㅋㅋ

나중에 또 튜닝이나 수정이 필요한 쿼리가 있는지 봐야겠다!

profile
👻

2개의 댓글

comment-user-thumbnail
2023년 7월 28일

좋은 글 감사합니다.

1개의 답글