Web/Backend

스칼라 서브쿼리, 연관 서브쿼리 동작원리 및 실행순서

limdef 2020. 8. 10. 01:04

join을 쓸때도 많지만 join보다 서브쿼리를 사용해야 할때가 있다.

그 중 select절에서 서브쿼리의 실행순서가 궁금해져서 포스팅하게 되었다.

 

먼저 서브쿼리의 명칭은 다음과 같다.

  • select 절에 있는 서브쿼리 - 스칼라 서브쿼리
  • from 절에 있는 서브쿼리 - 인라인뷰
  • where 절에 있는 서브쿼리 - 서브쿼리

 

where 절에 있는 서브쿼리는 당연히 메인쿼리가 실행되기전에 수행된다.

반면 스칼라 서브쿼리의 동작 원리는 다음과 같다.

 

1. 메인쿼리를 수행한 후 스칼라 서브쿼리에 필요한 값을 제공한다.

2. 스칼라 서브쿼리를 수행하기 위해 필요한 데이터가 들어있는 블록을 메모리로 로딩한다.

3. 메인쿼리에서 주어진 조건을 가지고 필요한 값을 찾는다. 

그리고 입력값(main query에서 주어진 값)과 

출력값을 스칼라 서브쿼리를 수행후 나온 결과 값으로 메모리 내의 query execution cache라는 곳에 저장해둔다.

4. 다음 조건이 메인 쿼리에서 스칼라 서브쿼리로 들어오면 해시함수를 이용해 해당값이 캐시에 존재하는지 찾고, 

있으면 즉시 반환, 없으면 수행후 캐시에 저장.

5. 메인쿼리가 끝날때까지 반복.

 

 

또한 이와 별개로

서브쿼리 중 메인쿼리의 컬럼을 사용하는 쿼리를 

연관 서브쿼리 (correlated subquery) 라고 하고

쿼리문은 수행할때 서브쿼리에서 사용하는 메인쿼리의 컬럼의 값이

메인쿼리문에서 정해지고 난후 연관서브쿼리가 수행된다고 한다.

 

위키피디아

 

즉, 메인쿼리의 each row마다 서브쿼리가 실행이 된다.

 

select b.*, 
(select count(*) from likes l where b.articleNo=l.articleNo and l.nickname="읽는이") as likechk,
(select count(*) from bookmark m where b.articleNo=m.bookedArticle and m.bookUser="읽는이") as markchk
from board b where b.articleUser="글쓴이";