대용량 통계 쿼리 작성 시 보통 데이터를 추출할 대상(기준) 및 그 대상에 대해 데이터를 추출할 합계(산출) 기준 등을 분류하고 이를 어떻게 다루어야 할 지 고민이 많이 된다.
가독성과 성능적인 부분을 많이 고민해야 하는데, 일단 고민의 시작이 보통 WITH절과 서브쿼리를 사용할 지 부터 이루어지므로 어떤 것을 사용해야 할 지 한 번 고민해보았다.
WITH
WITH절은 기준이 되는 테이블, 데이터를 산출할 영역을 WITH절로 한꺼번에 묶는 것이다.
서브쿼리
기준이 되는 테이블, 데이터를 산출할 영역을 서브쿼리로 묶는 것이다.
결론 : 성능개선도 상황에 맞게.
보통 서브쿼리로 하다가 반복되는 부분이 많으니 WITH절로 묶는 경우가 대부분인 것 같은데, 나의 경우 기준이 다른 데이터가 워낙 많아 WITH절로 묶는 것 부터 시작하였다. 그런데 이게 말 그대로 보통의 경우이고.. 서브쿼리로 시작하는 것을 일반적인 상황이라는 글들이 많았는데 좀 알아보니까 그냥 자신의 상황에 따라 맞게 시작하는 것이 좋은 것 같다.
WITH절의 경우 full scan이 일어나는데, 인덱스 및 조인조건을 잘 건다면 성능적인 부분을 크게 개선할 수 있다.
데이터 산출 조건을 통해 서브쿼리의 데이터양을 줄인다면, 서브쿼리가 WITH절보다 성능이 좋아질 수 있다. 또한 인덱스, 힌트 등의 조치를 통해 성능적으로 더 우세하게 만들 수 있다. 보통 서브쿼리가 인덱스의 영향을 받지 않아 성능이 안좋아 질 수 있다는 말이 있었는데, 오히려 서브쿼리로 튜닝한 후에 WITH절보다 더 조회성능이 개선되었다.
WITH절도 대용량 조건이면 사용하지 않는게 좋다고 하는데, 산출 기준이 너무 다르다면 어쩔 수 없이 WITH절을 사용해야하는 경우가 생긴다.
성능관점에서 WITH절/서브쿼리의 차이점
https://project-notwork.tistory.com/111
https://schatz37.tistory.com/3