티스토리 뷰

반응형

오라클를 조금 다뤄본 분들은 GROUP BY를 사용하면 ORDER BY를 사용하지 않더라도
자동으로 정렬이 된다는 것은 알고 계실텐데요(단 병렬처리(parallel) 제외)
그래서 책에서도 order by를 사용하지 않아도 된다고 나오죠.
그런데 아직도 그럴까요?
Oracle 10g R2 부터는 group by를 사용해도 자동으로 정렬이 되지 않습니다.
원인은 Oracle 10g R2 New Feature - New In-Memory Sor Algorithm 때문인데요.
정렬 알고리즘이 Hash Based로 변경되면서 부터 입니다.
많은 양의 데이터가 정렬될 경우 기존방식보다 월등한 성능을 낸다고 하더군요.
그럼 이전처럼 GROUP BY절을 사용하면 정렬이 되게 할 수 없을까요.
새로운 방식의 알고리즘을 사용하지 못하게 하면 되겠죠.

사용하지 않게 하는 방법
1. Optimizer Mode를 Rule일 경우 발생 안함
2. OPTIMIZER_FEATURES_ENABLE를 10.1로 함
3. init.ora "-gby_hash_aggregation_enabled"="FALSE 로 변경함


3번째 방식이 주로 사용되겠죠.

그러나 과연 새로운 알고리즘을 포기해서라도 GROUP BY 절의 정렬기능을 사용해야
할까요. ORDER BY절을 추가해주면 되는데 . . .
저두 테스트 해보기 전까지 GROUP BY와 ORDER BY를 같이 서술해 주면 2번 정렬하기
때문에 비효울 적이라고 생각 했습니다.
그러나 테스트 결과 GROUP BY , ORDER BY를 함께 사용해도 SORT는 한번만 발생하더군요. 그렇기 때문에 현재 사용중인 시스템에 SQL이 많고 GROUP BY절에 대한
정렬기능을 많이 사용한 경우를 제외하면 위처럼 옵션을 고쳐서 새로운 정렬기능을
OFF 시킬 필요는 없겠죠.
아울러 새롭게 개발하는 시스템에선 ORACLE 10g R2 이전 버전이라도 습관처럼
GROUP BY 와 함께 ORDER BY를 서술해
주면 10g R2 이후 버전으로 업그레이드
할때 이 문제는 피할 수 있을 듯 합니다.

참고> http://www.en-core.com/bin/main/module/board/view.asp?searchString=&column=&board_id=opentechnical&state=view&article_id
=22634&page_num=1&group_id=22630&direction=n&step=0



반응형