728x90

union 과 union all

union 과 union all 의 차이점은 멀까... 예전에 거래소에서 일하던 시절에 그차이점은 단순히 결과물이 중복제거
되어서 나오냐 안나오냐의 차이인줄 알았다.

맞는 말이다. 단순히 결과만 놓고보면 차이점은 그거밖에 없는것이다.

그러나 거래소에서 요구하는 결과는 집합적인 부분으로 볼때 두개의 집합을 합하는데 중복된것을 제거하여 데이터를 추출하는 경우는 거의 없다.

또한 옵티마이저가 처리하는 속도에 있어서 union은 전체범위처리를 하고 union all은 부분범위처리를 하기때문에
성능에도 union all이 유리하다는걸 알수 있다.

예를들어보자. 데이터 셋이 아래와 같이 있다고 가정하고 각각 union과 union all 로 해서 결과를 보고
실행계획도 보았다.


사용자 삽입 이미지
union 으로 했을경우에는 중복된 데이터에 대해서는
distinct가 되어나오고 친절하게도 sort되어서 나오고
있단걸 알수 있다. 이것은 전체범위 처리를 해서
두개의 집합이 각각 sort되어 비교하면서 처리되기 때문에
그결과도 당연히 sort된 결과값이 나오게 된다.
만약 데이터량이 엄청나게 많다면 당연히 성능저하의
원이이 될것이다.














실행계획을 보게 되면 마찬가지로 sort가 먼저 일어나고 있음을 알수 있다.
사용자 삽입 이미지

















그렇다면 union all로 쿼리를 날려보자..



사용자 삽입 이미지

모든 값들을 그대로 보여주고 sort도 되지 않은채
결과값을 뿌린다.
이것은 즉 부분집합처리를 하기때문에 이렇게
나올수 있는것이다.
데이터량이 많다면 당연히 union보다 빠르게
결과값이 튀어나올것이다.
















그렇다면 실제로 실행계획이 어떻게 세워지는지 보자..

사용자 삽입 이미지
















위에서 보듯이 sort 작업은 일어나지 않는다.

이렇든 union 과 union all의 차이점은 상당히 크다는걸 알수 있다.
또한 모든 데이터를 뽑아내어 데이터를 가공하는데 있어서도 union을 사용한 곳을 여러군데 보았다.
상황을 보니 중복된 데이터가 있을 가능성이 아주 희박하지만 만에하나 모든 컬럼의 값이 일치한다고 보면
잘못된 데이터를 뽑아오고 있는것이다.

나역시도 거래소에서 일할던 시절 예전에 작성된 sql문을 보면 union으로 해놓은 경우가 다수 있었다.
union all로 바꿔주어도 결과는 똑같았다. 왜냐 단지 중복된 데이터가 없었으니까... 하지만 위험하게 union을
사용하기보다는 안전하고 성능도 좋은 union all을 사용해야 되겠다.
728x90

'DB' 카테고리의 다른 글

ORA-00600 에러  (0) 2012.07.29
OUTER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN  (0) 2012.07.29
oracle과 sybase의 차이점  (0) 2012.07.29
마스터 디테일 구조에서 order by  (0) 2012.07.29
OALL8이 불일치 상태입니다  (0) 2012.07.29

+ Recent posts