개발자
안녕하세요, 항상 한 개의 테이블 또는 많아봤자 테이블 두개 조인한 결과로 api를 만들다가 갑자기 복잡한 로직을 다루게 되었습니다 미리 정해둔 response 데이터 형식으로 db 결과를 가공하려다 보니 사진과 같이 엄청나게 긴 쿼리문을 작성하게 되었고 데이터가 별로 많지도 않은데 성능도 나쁜 것 같아요...(워크벤치로 query cost확인해보니 최악의 경우 2200이 나옵니다....ㅜㅜ) 일반적으로 이렇게 긴 쿼리문은 작성해서 모든 것을 한번에 처리하지는 않을 것 같은데 어떻게 개선해야 할지 갈피가 잡히지 않습니다 어떻게 하는게 좋을까요..?
답변 1
비즈니스 로직이 쿼리에 들어가게 되네요. 쿼리문이 하나 같겠지만 explain 키워드와 함께 쿼리 실행 계획을 보면, Subplan이 여러개 등장하는 매우 복잡한 계획이 나올거에요. 한 번에 전부 처리하려고 하지 말고, 여러 개의 단순한 쿼리로 나눠서 처리하는 게 좋을 것 같습니다. 개인적으로는 아래처럼 할 것 같네요. DB에서는 간단하게 데이터를 불러오고, 서버단에서 자바 같은 언어로 로직 처리할 것 같습니다. 1. Case when 절은 자바에서 처리 2. 부하가 심한게 아니라면 테이블 전체 컬럼을 불러와서 Entity 클래스와 매핑 3. 서로 연관이 매우 높은 클래스에 한해서만 join으로 가져오기 4. 3번이 아니라면 그냥 쿼리 결과 한번 받아서 자바에서 가공하고, 다시 DB에 쿼리 한 번 더 보내서 정보 받기 쿼리에 비즈니스 로직이 들어가면 들어갈수록 유지보수성은 떨어집니다. 가시성도 떨어지고 DB의 자원을 많이 사용하다보니 성능도 악화될 여지가 있습니다. 보통 DB보다 서버의 인스턴스 수가 많은데, DB에 로직을 죄다 맡겨버리면… DB 성능이 나락가기 쉽습니다 물론 DB에서도 함수나 프로시저를 활용해 유지보수를 챙길 순 있지만, DB에서의 이런 개념은 보통 자바 같은 언어에서 생각하는 함수와 구조가 많이 다르기도 하고 비효율성이 커요.
익명
작성자
2024년 08월 02일
너무감사합니다! 저게 쿼리에 비즈니스 로직을 포함시킨다는거네요..ㅜ 조언 참고해서 수정해보도록 하겠습니다!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!