서브쿼리질문입니다. 0 9 1,643

by 하나가라 [2013.12.04 14:45:18]



서브쿼리 부분을 공부하던중 책내용에는

서브쿼리는 메인쿼리 안에 포함된 종속적인 관계이기 때문에 논리적인 실행순서는 항상 메인쿼리안에서 읽혀진 데이터에 대해 서브쿼리에서 해당조건이 만족하는지를 확인하는 방식으로 수행되어야한다

오라클클럽사이트 DB SQL 서브쿼리 강좌내용에는

Subquery는 Main Query 이전에 한 번 실행된다.

이렇게 나와있는데 두개가 같은 말인가요??;;

by 아발란체 [2013.12.04 14:54:55]
서브 쿼리를 기술하는 위치에 따라 다릅니다.
서브 쿼리를 기술하는 위치에 따라 서브 쿼리를 다르게 부르기도 합니다.
스칼라뷰, 인라인뷰 등.
당장 이 두개만 봐도 실행 순서가 다릅니다 ~ :)

by 아발란체 [2013.12.04 14:59:52]

서브 쿼리의 다양한 활용 방법중 하나로 위 설명이 부합할 수 있지만,
서브 쿼리에 대한 일반적인 내용으로 말하면 문제가 있는 것 같습니다.

결론은 서로 다른 얘기 같습니다.


by feelie [2013.12.04 15:21:04]

질문에서 말씀하신 subquery는 조건절에 사용된 쿼리로 정의할수 있을것 같고요..

서브쿼리를 포함한 메인쿼리가 실행되는 실행계획은 여러방법이 있습니다.

메인쿼리안에서 읽혀진 데이터에 대해 서브쿼리에서 해당조건이 만족하는지를 확인하는
방식은 filter 방식으로 풀렸다고 실행계획에 나옵니다.

하지만 Filter 실행계획의 문제는 메인쿼리가 무조건 드라이빙 된다는 것입니다.
그래서 오라클은 서브쿼리도 조인처리 실행계획을 만들어서 수행하고 있습니다.(세미조인)
조인으로 변경된다면 서브쿼리가 여러번 읽힐 이유는 없지요....

by 하나가라 [2013.12.04 15:53:39]
아발란체님//feelie님 감사합니다.. 뒤로 갈수록 어려워지네요 ㅠㅠ

by 김치찌게 [2013.12.04 17:25:12]
서브 쿼리는 분류 방법이 몇가지 있는데,  위치에 따라 분류하는  방법이 있습니다.
위치에 따라 수행되는 횟수가 실행계획이 달라질 수 있습니다. 
일반적으로는 
select 절의 subquery (scalar subquery) : return 값이 하나이니 
from 절의 subquery (inline view)
where 절의 subquery(subquery ?)

select 절은 보통 return row 수 만큼,
from 절은 join 시 1번,
where 절은 조건 check or filter 횟수 만큼 수행되는 것이 기본이지만
merge 등이 일어나지 않을 때 상황이고, 실행계획을 보면서 판단해야 됩니다. 

또...
select 절의 subquery의 경우도 caching 되는 version이 있으므로, 실제로는 return rows 만큼 수행되었다고 볼 수도 없습니다. 

문맥에 따라 subquery의 의미를 확인하시는 고, 실행계획으로 판단하시는 게 맞을 것 같습니다. 

by 마농 [2013.12.04 17:46:55]

음...
이 문제는 위치에 따른 분류라기 보다는.
서브쿼리안에 메인쿼리의 값이 조건으로 주어지느냐 아니냐의 차이로 구별해야 할 듯 하네요.
서브쿼리 안에 메인컬럼값 조건 유무에 따라...
- 있으면 : 상관관계서브쿼리 => 메인쿼리에 종속적으로 수행
- 없으면 : 독립서브쿼리 => 메인쿼리와 독립적으로 수행


by 아발란체 [2013.12.09 17:41:51]
전혀 생각 못한 관점인 것 같습니다.
또 배워 갑니다.

근데 관점을 바꾸니 좀 알쏭달쏭한 부분이 발생하네용, ㅠ,.ㅠ)ㆀ
결국 경험이 부족하여 그런 것 같은데요,

"있으면"이란 부분이 허용 될 수 있는 위치와 - ⓐ
"없으면"이란 부분으로 사용 되는 위치가 - ⓑ
(위치 관점에서) 서로 독립적(ⓐ != ⓑ)이라고 이해 할 수 있는 부분인지용.


by 마농 [2013.12.09 18:05:50]

글쎄요? 허용되는 위치라???
인라인뷰는 상관관계서브쿼리가 안되죠. 무조건 독립입니다.
이것만 빼면 어디든 허용됩니다.
스칼라서브쿼리는 보통 상관관계로 사용하지요. 독립서브쿼리 쓴다고 안될것은 없습니다.
IN 절의 서브쿼리는 보통 독립적으로 사용하죠. 상관관계 사용한다고 안될것은 없습니다.
Exists 절의 서브쿼리는 보통 상관서브쿼리로 사용하죠. 독립적으로 사용한다고 안될것은 없습니다.

상관관계 서브쿼리와 독립적인 서브쿼리의 가장 큰 차이점은
서브쿼리만 복사해다가 별도로 수행할 경우
상관관계 서브쿼리는 에러발생하구요.(메인 컬럼을 못찾죠)
독립 서브쿼리는 정상 수행이 됩니다.


by 아발란체 [2013.12.09 23:28:39]
답변 감사합니다 ~ !
지금 스칼라와 인라인뷰를 생각하며 헤갈려 하고 있는 것 같습니다. ㅡ,.ㅡ)ㆀ

스칼라는 있고 없고 상관 없이 메인 종속 관계로 작용하고
인라인뷰는 상관 관계가 안 되고.. 이게 무조건적이며 독립적인 관계라 생각 했습니다.

근데 조건에 있고 없고에 따라
이 작용이 변경 될 수 있는 것인지 경험이 부족하여 조금 개념이 엉켜 버린 부분이 있는 것 같습니다.

다른 관점에서 말씀 주신 것인데 
경험이 적어 완전 다른 생각을 하고 있는 것 같기도 하고요, ^.^;

회사에서도 이해력이 좀 딸려 주변 분들을 많이 괴롭히게 되네요... 뉴ㅅ뉴)ㆀ 
아, 세미나 참가 할 수 있으면 이런 것 정리해서 물어보면 최고인데... = ㅁ =)ㆀ
그냥 무시하셔도 됩니다, ㅡ ㅁ ㅡ);;;
(실례가 안 된다면 14일 뒷풀이에서 질문을.....;;; 요거 하나만...   ^.^;)
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입