inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

데이터 분석 SQL Fundamentals

Group By 실습 - 01

강사님 with 절을 사용하시는 이유가 궁금합니다.

해결된 질문

458

cjh

작성한 질문수 24

1

강사님께서 with절을 꾸준히 보여주시는 이유가 있을거라 생각해서

찾아보니 장점도 있지만 단점도 있더라구요

with를 사용하면 임시테이블을 만들기 때문에

장점은 재귀 사용이 가능하고, 반복 사용이 가능하다.

단점은 불필요한 코드가 들어가서 가독성이 나빠질수 있고

임시 테이블을 만들기 때문에 성능에 영향을 줄수있다고 적혀있더라구요

 

  1. 강사님께서는 with를 꾸준히 보여주시는 이유가 궁금합니다.

select a.dname , round(avg(c.sal),0) as "부서별 평균 급여"
 from dept a
   join emp b 
   on a.deptno = b.deptno and a.dname in ('SALES','RESEARCH')
   left join emp_salary_hist c 
   on b.empno = c.empno
group by a.dname ;
  1. 저는 and에 부서명 조건을 추가했습니다.

    그 이유는 dept.dname에 인덱스가 없고

    where에 dname을 넣으면 조인후에 필터가 되기때문에 join 조건에 추가하면 조인할때 데이터를 조금 더 줄인 상태에서 실행한다고 이해를 했습니다.

    제가 잘못 이해를 하고 있는 걸까요?

    조인 할때 and 조건도 마찬가지로 인덱스가 없다면 큰 상관이 없는건가요 ?

     

sql postgresql dbms/rdbms

답변 1

1

권 철민

안녕하십니까,

  1. 강의에서 With 절을 사용한 가장 큰 이유는 강의 설명을 SQL 집합 단위로 쪼개면서 내용 전달을 보다 쉽게 하기 위해서 입니다.

    강의 설명을 위한것을 제외하고, with절을 사용하는 이유는 아래와 같습니다.

    with 절 이전에는 inline view를 사용했습니다. 그런데 inline view로 설정된 집합이 SQL내에서 다시 사용되어야 하면 동일한 inline view를 반복해서 SQL내에 기재해 줘야 했습니다. 이러한 문제점이 있어서 With 절이 만들어 진것입니다. With절에 기술된 집합은 SQL 내에서 여러번 사용되어도 With절을 다시 적용해 줄 필요가 없습니다.

    좀 억지스러운 예제 이지만

    select * from emp where dept_no=20 이라는 집합을 SQL내에서 여러번 반복해서 사용해야 할 때 Inline view를 사용하면

    select * from (select * from emp where dept_no=20) a join (select * from emp where dept_no=20) b on a.emp_id = b.emp_id 로 해야 합니다.

    반면에 with절을 사용하면

    with temp_with as (select * from emp where dept_no=20)

    select * from temp_with a join temp_with b on a.emp_id = b.emp_id

     

    가독성도 with 절이 더 좋습니다. 다만 online성 쿼리를 사용할 때 PostgreSQL의 경우 With절의 실행계획이 최적으로 풀리지 않을 수도 있습니다. 이는 PostgreSQL에서 살짝 문제가 될수도 있습니다. 다만 본 강의와 같이 전체 데이터를 처리하는 분석용 SQL에서는 문제가 되지 않습니다.

     

  2. 인덱스와 조인, 그리고 SQL 튜닝에 대해서는 고려해야 할 사항이 매우 많습니다. 튜닝 전체를 관통하는 규칙은 있지만, 다양한 인덱스 사항과 데이터 분포도, 조인의 방법등에 따라서 동일한 튜닝이라도 어떤 경우는 성능이 향상되고 어떤 경우는 그렇지 않을 수 있습니다.

    본 강의가 SQL 튜닝 강의가 아니다 보니, 실습용으로 만들어진 SQL이 튜닝을 전제로 해서 만들어진것이 아닙니다. 질문하신 부분에 대해서 제가 답변을 드리려면, 여러가지 상황을 고려해서 말씀을 드려야 하므로 올바른 답변이 되기가 어려운 부분이 있어서 쉽게 답변 드릴 수가 없습니다. 모쪼록 양해 부탁드립니다.

0

cjh

강사님 답변 감사합니다 !!

답변 주신 내용에도 추가로 공부할 수 있는 키워드를 주셔서 감사합니다 !! 좋은하루 보내세요

'레벨 유지'의 의미에 대한 질문

0

53

2

date_part

0

56

2

lag/lead offset 관련 질문

0

56

2

join 관련 질문 (inner join, left join)

1

101

2

배치에서 full outer join을 쓴다고 하셨는데 예시를 알 수 있을까요?

0

90

2

Madrid에 살고 있는 고객이 주문한 주문 정보를 구할것. 실습 질문드립니다

0

54

2

rollup시 null값 매출 라벨링

0

55

2

10. 조인 실습 - 02 관련 질문

0

60

1

조인실습03 - join의 pk-fk join

0

109

2

조인실습03 - join의 pk-fk join

0

69

2

(공유)맥, 스키마 import

0

81

2

sql 입문자인데, 이 강의와 sql 코딩테스트와 연관이 있을까요?

0

138

2

1인지 M인지는 결국엔 테이블을 직접 확인을 해야 하는걸까요?

0

132

2

안녕하세요. 튜닝핵심가이드강의 관련해서 여쭤보고 싶어서 남깁니다.

0

91

1

섹션5 Group by 실습-01 강의 예제 질문

0

119

2

섹션2 조인 기반 메커니즘에서 조인 실습 - 04 강의 예제 질문

0

125

2

섹션2 조인 실습 01 강의 질문

0

134

2

lead lag 이해 강의에서 윈도우 절은 사용되지 않습니다.

0

128

1

Dbeaver오류

0

631

2

직원 별 가장 높은 매출

0

119

1

강의순서대로 실습코드순알려주세요.

0

134

1

m:n inner join일 경우 cross조인과 동일하게 동작되는건가요?

0

131

1

rollup

0

91

2

Dbeaver에 접속해도 postgressql이 네비게이터에 안보입니다.

0

355

2