며칠 전 한 게시판의 목록을 불러오는데 조회가 안 되는 일이 있었다.
정확히는 기본 리스트는 시간이 좀 걸려도 떴지만, 검색을 했을 때 조회가 어어어엄청 오래 걸리는 일이었다.
게시판의 데이터 양이 워낙 많기도 했지만 그 전에는 분 단위로 넘어가진 않았는데, 이번엔 분을 넘겨버린 것이다...
뭔가 있다고 생각해서 원인을 분석해봤다.
원인을 찾기 위해 두 가지를 살펴보았다.
- 목록을 불러올 때 앞 단에 걸린 조건이 문제일까?
- 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테이블 없이도 다 뽑을 수 있었기 때문에!
암튼 조인을 하나 풀었더니 검색도 잘 작동하고 리스트도 잘 나오고ㅎㅎ
나 혼자 해결한 것은 아니고 선임님과 같이 해결하였지만 그래도 한건 한 느낌이라 기분 좋았다ㅋㅋㅋ
나중에 또 튜닝이나 수정이 필요한 쿼리가 있는지 봐야겠다!
좋은 글 감사합니다.