• 카테고리

    질문 & 답변
  • 세부 분야

    데이터베이스

  • 해결 여부

    미해결

스칼라 서브쿼리 관련

23.08.02 12:29 작성 조회수 346

0

안녕하세요, 강의 잘 듣고 있습니다.

스칼라 서브쿼리를 성능문제로 지양해서 써야한다고 말씀하셨는데 혹시 더 구체적으로 알 수 있을지요?

스칼라 서브쿼리나 다른 서브쿼리나 어차피 메인 테이블을 하나씩 읽으면서 조건으로 달리 테이블을 처리하는건 같지 않나요?

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 내부에서 좀 더 유연한 실행계획등의 수립 차원에서 더 유리할 수 있습니다.

 

감사합니다.

 

boyjeong님의 프로필

boyjeong

질문자

2023.08.03

이해되었습니다.

자세한 답변 감사드립니다:)