해결된 질문
작성
·
147
·
수정됨
답변 1
0
mini0529님 안녕하세요! WITH 문 부분을 학습하고 계시면서 궁금한 내용이 생기셨군요! 질문해주셔서 감사합니다.
우선 WITH문을 제가 알려드린 이유는 논리적인 사고를 하기 위해 쿼리를 분리해서 생각하는 것이 필요하다 생각했어요. 실무에서 쿼리를 작성하다보면 500~1000줄 넘는 쿼리를 작성하는 경우가 많은데, 그냥 작성할 경우에 쿼리 유지보수가 정말 힘들어요. 한 부분에서 수정하면 다른 부분에 자동으로 적용되도록 하면 좋은데 조건을 주기적으로 추가해줘야 한다면, 실수할 가능성이 커지겠지요.
그래서 공통적으로 참조하거나 반복적으로 써야 한다면 WITH 문에 정의해서 사용하는 것을 추천드리고 있어요. 그래서 가독성과 유지 보수를 위해 WITH 문을 사용하는 것을 습관을 들이시면 좋겠다는 생각에 강의에 추가했어요.
BigQuery에선 WITH문(CTE)이 쿼리에 영향을 미칠 수도 있지만, 공식적인 입장에선 가독성을 위해 사용한다고 말하고 있습니다.
공식 문서 : https://cloud.google.com/bigquery/docs/best-practices-performance-compute
Note: WITH
clauses with common table expressions (CTEs) are used for query readability, not performance. There is no guarantee that adding a WITH
clause causes BigQuery to materialize temporary intermediate tables and reuse the temporary result for multiple references. The WITH
clause might be evaluated multiple times within a query, depending on query optimizer decisions.
해석 : WITH 절과 공통 테이블 식(CTEs)은 쿼리의 가독성을 위해 사용되며, 성능 향상을 위한 것이 아닙니다. WITH 절을 추가한다고 해서 BigQuery가 임시 중간 테이블을 구체화하고 여러 번 참조할 때 임시 결과를 재사용한다는 보장은 없습니다. WITH 절은 쿼리 옵티마이저의 결정에 따라 쿼리 내에서 여러 번 평가될 수 있습니다.
참고로 위 이야기는 BigQuery 기준이고 다른 SQL 엔진에서는 다를 수도 있어요. 엔진마다 구체적인 구현 방식의 차이가 있기 때문에, 다른 SQL 엔진에선 다를 수 있어요.
실무적인 레벨에서 공유드리면 저는 꽤 긴 쿼리를 작성했지만, WITH 문 때문에 성능 하락을 경험한 적은 딱히 기억나진 않네요. 다만 쿼리가 500~1000줄 이상이 되면서 재사용이 많다면 별도의 물리적인 테이블(테이블을 하나로 저장)로 저장했기에 이런 것 같아요. 학습하는 입장에선 가독성을 챙기면서 쿼리를 작성해보자!라고 생각해보시고, 짧은 쿼리라고 하면 WITH 문을 꼭 굳이 안써도 된다 정도로 생각하시면 좋을 것 같네요. 저도 한번만 사용된다고 하면 그냥 서브 쿼리를 사용하는 경우도 있습니다. 반복적으로 사용될 것 같다 + 다른 사람이 봐야 한다! 하면 WITH 문을 작성하는 것을 추천드려요. 쿼리를 작성하는 것도 습관이라 처음부터 이런 습관을 가지는 것을 추천드려요. 쿼리를 그냥 작성하는 분들이 꽤 많기에 코딩 테스트나 쿼리 테스트에서 가독성을 고려해서 작성한다면, 구조적인 부분을 좋게 볼수도 있지 않을까 싶어요.
또 궁금한 내용이 있다면 언제든 말씀해주셔요. 감사합니다.
아아 그렇군요! 앞으로 WITH구문 활용하는 습관을 들여봐야겠어요!
완전 초보자인데 도움 많이 받고 있습니다..ㅠㅠ
정성스러운 답변 감사드립니다!!