스칼라 서브쿼리 관련
675
작성한 질문수 18
안녕하세요, 강의 잘 듣고 있습니다.
스칼라 서브쿼리를 성능문제로 지양해서 써야한다고 말씀하셨는데 혹시 더 구체적으로 알 수 있을지요?
스칼라 서브쿼리나 다른 서브쿼리나 어차피 메인 테이블을 하나씩 읽으면서 조건으로 달리 테이블을 처리하는건 같지 않나요?
DB입장에서 혹시 실행계획을 세울 때 어떻게 차이가 날까요?
제대로 질문을 하였는지 잘 모르겠는데 답변 주시면
감사하겠습니다.
답변 1
0
안녕하십니까,
스칼라 서브쿼리가 성능을 떨어뜨린다기 보다는 남발(?)을 하면서 성능 저하 요소가 발생할 수 있다는 의미 입니다.
스칼라 서브쿼리는 주로 조인 대용으로 자주 사용됩니다. 조인을 사용하지 않고도 select 절에 기술해서 원하는 컬럼을 쉽게 가져 오기 때문입니다. 이러한 중독성(?)때문에 종종 실무에서 조인을 사용해도 되는데, 스칼라 서브쿼리를 남발하는 경우가 발생하기 쉽니다. 예를 들어 customers 테이블에 다양한 고객 정보, 고객명, 성별, 나이, 주소등이 있다고 가정하고, 이를 orders 테이블을 조회시 이들 주문 고객에 대한 정보도 함께 추출해 보는 요건을 서브쿼리로 작성하면 아래와 같이 작성할 수 있습니다.
select order_id, order_date,
(select customer_name from customers x where x.customer_id = a.customer_id) as customer_name,
(select age from customers x where x.customer_id = a.customer_id) as age,
(select gender from customers x where x.customer_id = a.customer_id) as gender,
(select address from customers x where x.customer_id = a.customer_id) as address
from orders;
이렇게 스칼라 서브쿼리를 적용할 경우 DBMS 종류에 따라서 하나의 orders 레코드가 총 4번 customers 테이블에 연결을 해야 하는 경우가 발생하여 불필요한 IO 리소스가 더 소모 될 수 있습니다.(서브쿼리가 orders 레코드당 4번 수행됨).
물론 특정 DBMS의 경우 사용자가 4개의 서브쿼리를 사용하더라도 레코드당 1번만 연결되도록 쿼리를 다시 내부적으로 해석해서 수행 할 수 있습니다. (과거 스칼라 쿼리가 처음 나왔을 때는 위의 경우에 무조건 4번 연결했습니다만, 지금은 DB들이 많이 좋아져서....). 하지만 스칼라 서브쿼리가 이런 성능 낭비적인 요소가 발생할 수 있다는 부분은 인지가 필요합니다.
따라서 조인으로 적용이 충분이 가능하다면 스칼라 서브쿼리보다는 조인으로 적용하는게 DBMS 내부에서 좀 더 유연한 실행계획등의 수립 차원에서 더 유리할 수 있습니다.
감사합니다.
'레벨 유지'의 의미에 대한 질문
0
56
2
date_part
0
56
2
lag/lead offset 관련 질문
0
58
2
join 관련 질문 (inner join, left join)
1
101
2
배치에서 full outer join을 쓴다고 하셨는데 예시를 알 수 있을까요?
0
91
2
Madrid에 살고 있는 고객이 주문한 주문 정보를 구할것. 실습 질문드립니다
0
54
2
rollup시 null값 매출 라벨링
0
56
2
10. 조인 실습 - 02 관련 질문
0
61
1
조인실습03 - join의 pk-fk join
0
109
2
조인실습03 - join의 pk-fk join
0
70
2
(공유)맥, 스키마 import
0
82
2
sql 입문자인데, 이 강의와 sql 코딩테스트와 연관이 있을까요?
0
138
2
1인지 M인지는 결국엔 테이블을 직접 확인을 해야 하는걸까요?
0
132
2
안녕하세요. 튜닝핵심가이드강의 관련해서 여쭤보고 싶어서 남깁니다.
0
93
1
섹션5 Group by 실습-01 강의 예제 질문
0
121
2
섹션2 조인 기반 메커니즘에서 조인 실습 - 04 강의 예제 질문
0
125
2
섹션2 조인 실습 01 강의 질문
0
134
2
lead lag 이해 강의에서 윈도우 절은 사용되지 않습니다.
0
128
1
Dbeaver오류
0
633
2
직원 별 가장 높은 매출
0
119
1
강의순서대로 실습코드순알려주세요.
0
134
1
m:n inner join일 경우 cross조인과 동일하게 동작되는건가요?
0
132
1
rollup
0
91
2
Dbeaver에 접속해도 postgressql이 네비게이터에 안보입니다.
0
357
2





