해결된 질문
작성
·
411
·
수정됨
0
안녕하세요 선생님,
강의 너무 재밌게 복습하고 있는 수강생입니다.
질문이 있어서 글을 씁니다.
" 스칼라 서브쿼리 실습 - 01 " 강의 07:10 에서 아래 쿼리에 문제가 있다고 알려주십니다.
select a.*,
(select avg(sal) from hr.emp x where x.deptno = a.deptno) dept_avg_sal
from hr.emp a;
그리고 그 과정에서 M:N join 결과물을 예로 들어서 왜 그런 지를 알려주시는데요, 여기서 의문이 생겼습니다.
"스칼라 서브쿼리 실습 - 01 " 바로 이전 강의에서 스칼라 서브 쿼리는 메인 쿼리의 각 레코드 별로 연산이 수행된다는 걸로 기억합니다.
그 말은...
(select avg(sal) from hr.emp x where x.deptno = a.deptno)
위 스칼라 서브쿼리가 hr.emp 테이블의 각 레코드 별로 연산이 수행된다는 걸로 전 이해합니다.
그런데 07:10 때는 이걸 조인의 결과물로 설명하시면서 좋지 않은 쿼리라고 알려주십니다.
각 레코드 별로 연산을 수행한다고 생각하면 사실 저 서브쿼리가 잘못된 쿼리 같지가 않다고 저는 생각하는데, 그게 아닌가요? 조인을 통해서 스칼라 서브쿼리를 좋은지 아닌지를 판단해야 되는 건가요??
답변 1
1
안녕하십니까,
강의를 다시 들어보니, 조인과의 차이를 설명하면서 스칼라 서브쿼리가 m:m 조인이 된다는 것이 물리적으로는 DB 내부에서 m:m이 되어서 성능이 저하된다는 의미를 설명한다는게 결과적으로 m:m 조인이 될 수도 있다는 식으로 이해되게 잘못 설명이 된 것 같습니다.
스칼라 서브쿼리는 강의에서도 설명드리듯이 from절 집합의 레벨을 변경하지 않습니다.
좋지 않은 쿼리라는 의미가 잘못된 SQL이라는 의미는 아닙니다(전체 문맥적으로 들어보시면 잘 아시겠지만... ). 오히려 OLTP 쿼리라면 적어주신 바와 같이 스칼라 서브쿼리를 사용하는게 더 좋습니다
다만 대용량의 분석 SQL이거나, 가져와야할 emp 테이블의 건수가 매우 많다면 설명 드린대로 많은 개별 emp 레코드별로 스칼라 서브쿼리내의 개별 emp 레코드들을 dept들을 중복해서 연결해야 하므로 성능적으로 많이 느려 질 수 있습니다.
요약해서 말씀 드리면 적어주신 스칼라 서브쿼리는 잘못된 쿼리가 아닙니다. 다만 스칼라 서브쿼리의 사용이 조인 보다 상대적으로 쉽기 때문에 남용(?)되는 경향이 많습니다.(예를 들어 여러개의 가공 컬럼들을 만들기 위해 비슷한 스칼라 서브쿼리를 가공 컬럼 별로 수행하는 등의 문제나 데이터 연결을 너무 빈번하게 수행하는 등의 경우)
때문에 명확하게 개별 집합들을 정의가 쉽게 가능하고, 메인 집합의 레벨이 조인을 통해서 변경되지 않는다면, 가급적 조인을 사용하는 것이 더 좋다는 의미로 해당 내용을 받아들여 주셨으면 좋을 것 같습니다.
감사합니다.
상세한 답변 정말 감사합니다!!