본문 바로가기
프로젝트(진행중)/MySQL

서브쿼리와 With절 쓰임새 차이

by 일말고프로젝트 2022. 10. 2.

서브쿼리를 난무하다 보니 알아볼 수 없는 지경의 쿼리가 되어 난감할 때가 많았다. 그렇다고, 매번 테이블을 생성하기도 어려울 땐 With절을 쓰면 보기도 편하고, 쓰기도 편하다. 이 둘의 차이를 나름 정리해보겠다.

 

  서브쿼리 WITH
주 활용 SELECT 절의 결과를 WHERE절에서 하나의 변수처럼 사용하고 싶을 때 사용 이름을 가진 서브쿼리를 정의한 후 사용하는 구문
위치 SELECT, FROM, WHERE 독립적
장점 코딩할 때는 편하다 가독성이 높아지고, 재사용할 수 잇음
단점 연산 비용이 추가됨. 최적화 받을 수 없음. 쿼리가 복잡해짐 튜닝시 적절하게 가공되지 않으면 메모리 로드가 많이 걸림

 

서브쿼리 주의할 점

 

서브쿼리를 쓰다보면 코딩하는 입장에선 편한 나머지 마구잡이로 쓰게 되는 경향이 있다. 아무리 주석을 달며 쿼리를 작성한다 해도 몇 주가 지나서 한번 쳐다보게 되면 그야말로 고대 문자 해석처럼 알아보기가 쉽지 않다. 특히 최적화, 계층적 쿼리 같은 깊은 SQL지식을 모르는 나로서는 서브쿼리 내에도 그야말로 연산량이 지옥인 쿼리들을 우겨넣기 일쑤라 계산 측면에서도 그다지 효율적이지 못했다.

 

이 부분을 해결하기 위해선 근본적으로 SQL에 대한 근본적인 공부가 더 필요하지만 당장의 대증요법으로 서브쿼리 작성시 주의사항을 찾아보았다. 너무 일목요연하게 정리하신 분이 있어 레퍼런스로 남긴다.

https://schatz37.tistory.com/3

 

[SQL] 성능 관점에서의 서브쿼리(Subquery)

0. 들어가며 SQL 쿼리를 작성하다보면 서브쿼리를 자주 사용하게 됩니다. 서브쿼리는 '쿼리 안의 쿼리' 라고 생각을 하면 되는데, SQL 구문의 다양한 부분(SELECT, FROM, WHERE, HAVING, ORDER BY 절 등)에 사

schatz37.tistory.com

 

요약하자면 아래와 같다.

 

서브쿼리를 활용할 때 고려할 점

1. SQL 구문 전체에서 불필요한 Join 연산을 하지 않았는지?
2. 서브쿼리를 사용할 때 테이블 접근을 최소화 했는지?

 

특히 2번 항목이 내 쿼리 연산 증가의 주범인 것 같았다. 쿼리가 길어지다보면 FROM에서 참조했던 테이블을 서브쿼리에서 스칼라 연산을 위해 한번 더 참조하고, 또 WHERE 문에서 또 참조하는 문제가 발생하곤 하는데 이 부분이 서브쿼리의 속도를 느리게 하는 주범인 것 같다. 

 

서브쿼리를 안쓸 수는 없겠지만 위 문제들을 고려하면서 써야 효율적인 쿼리 작성이 될 것이다.

 

WITH문 활용법

 

서브쿼리와 쓰임새 측면에서 가장 다른 점은 여러번 사용하는 임시 테이블이라는 것이다. 생각해보면 계속 사용하는 경우에는 아예 테이블로 만들어 활용하곤 하는데 그 테이블 활용 정도까진 아니지만 자꾸 나와서 서브쿼리로 하자니 아주 귀찮은 그 어느 지점에 있을 때 사용하는 것 같다.

 

WITH문의 사용법이 정리가 잘 된 글을 가져왔다.

https://coding-factory.tistory.com/445

 

[Oracle] 오라클 WITH절 사용법 & 예제 (임시 테이블 만들기)

WITH절이란 WITH절은 오라클9 이후 버전부터 사용이 가능하며 이름이 부여된 서브쿼리라고 생각하시면 됩니다. 임시테이블을 만든다는 관점에서본다면 VIEW와 쓰임새가 비슷한데 차이점이 있다면

coding-factory.tistory.com

 

활용시 주의해야 할점은 다음과 같다.

 

- SQL의 가장 앞에 위치

:  WITH절을 쓰는 이유 자체가 후술될 쿼리에서 참고하기 위함이기 때문에 맨앞에서 저장하는 것이 맞다.

 

- 동작방식 힌트를 추가하자

: SQL의 구조가 변경되었을 때 성능 개선의 목적과 부합하지 않는 동작방식으로 수행 될 수 있으므로 나중에 참조해 변경해야 함

 

- 추출 건수가 많은 경우 피하자

: 데이터 읽을 때와 저장할 때 메모리 사용량이 많아지면 WITH절을 써서 성능을 개선하는 큰 이유가 없음. 추출하는데에는 오랜 시간이 걸리나 건수가 적을 경우에 사용하자

 

 

 

'프로젝트(진행중) > MySQL' 카테고리의 다른 글

프로그래머스 SQL 공부 1  (0) 2023.02.27
칼퇴를 지켜준 ChatGPT 활용 후기  (0) 2023.02.17
Pymysql - Maria DB 연결 오류(Err 99)  (0) 2022.01.02
SQL 고득점 Kit - 3  (0) 2021.11.27
SQL 고득점 Kit - 2  (0) 2021.11.21

댓글