본문 바로가기

IT성장일기

[스터디/친절한SQL튜닝]서브쿼리 조인

지난주 국가공인 SQLP 문제를 풀며 개념을 정리하는데 

팀원 중 한명이 MERGE문과 UNNEST문의 차이를 물어왔다.

 

평소 그냥 단어의 뜻 그대로 MERGE는 MERGE할때, UNNEST는 UNNEST할때 쓰인다고 이해하고 넘어갔던 부분이라 

차이점에 대해 구체적으로 생각해 본적이 없었다.

 

게다가, MERGE는 FROM 절에 쓰인 서브쿼리,

UNNEST는 WHERE 절에 쓰인 서브쿼리에서 사용될수있다고 생각했는데

친절한SQL튜닝 예시를 보는데 내가 알고있는것과 전혀 달라서 다시한번 개념을 정리해보려고 한다.

 

둘다 서브쿼리를 튜닝하는데에 쓰인다는 공통점이 있고,

MERGE, UNNEST 둘다 메인쿼리블록과 동일한 레벨에서 수행하도록 한다는 것에서 기능의 유사함이 있다.

 

아래 링크는 merge와 unnest에 대해 가장 잘 정리된 것 같아 참고로 적어둔다.

 

http://dbcafe.co.kr/wiki/index.php/%ED%8A%9C%EB%8B%9D_%EC%BF%BC%EB%A6%AC_%EB%B3%80%ED%98%95#.EC.A1.B0.EA.B1.B4.EC.A0.88_Pushing

 

두 힌트의 특성을 이해하기 위해서는 옵티마이저가 쿼리를 최적화 할때 쿼리 블록단위로 최적화한다는 점을 유의해야한다.

 

내가 찾은 차이점은 인라인뷰에서는 unnest를 쓸 수 없다는 것이다.

(물론 이것도 좀더 테스트하고 조사해봐야 정확히 알것같다.)

unnest가 중첩쿼리를 푼다는 뜻이니까 의미적으로 조인으로 풀리는 인라인뷰에서는 사용할 수 없지않을까 생각된다.

merge는 뷰머징을 한다는 뜻이니까 링크글에 작성된 예외 케이스를 제외한다면 모든 서브쿼리에서 사용가능한것 같다. 

이론부터 헷갈리니 실전에 사용이 더 어렵다ㅠ

앞으로 실전에 사용하고 예시를 작성해둬야겠다.

 

인터넷에서 차이점으로 검색되는 자료중에서도 틀린정보도 많은것 같아 자체 테스트가 가장 정확해 보인다.

UNNEST는 서브쿼리쪽에서 사용, MERGE는 메인쿼리쪽에서 사용하는 힌트 라는 차이점이 검색되었지만 merge는 서브쿼리쪽에서도 사용가능한 힌트이다.

 

유독 튜닝관련자료들은 잘못된 정보가 많은것 같다.

그만큼 혼동의 분야인것 같다. 

오늘도 혼란스러운 하루 끝!

 

2023-07-15 추가 업데이트!

unnest : 서브쿼리에서 쓰이는 힌트

merge : 뷰에서 쓰이는 힌트

서브쿼리가 수행되면서 뷰처럼 풀리기때문에 혼용해서 사용이 가능한 것으로