• 카테고리

    질문 & 답변
  • 세부 분야

    데이터베이스

  • 해결 여부

    해결됨

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

23.06.06 23:24 작성 23.06.06 23:31 수정 조회수 203

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 조건도 마찬가지로 인덱스가 없다면 큰 상관이 없는건가요 ?

     

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

cjh님의 프로필

cjh

질문자

2023.06.07

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

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